如何使用 std::enable_if 时拆分声明和实现
Howto split declaration and implementation when using std::enable_if
当我有一个带有我专门研究的成员函数的结构时std::enable_if
如何从实现中拆分声明?
示例代码(在 ideone 中)
struct node
{
template < class T >
void analyze(T t, typename std::enable_if<std::is_integral<T>::value>::type* = 0)
{
std::cout << "is_arithmetic type " << t << "n";
}
template < class T >
void analyze(T t, typename std::enable_if<std::is_floating_point<T>::value>::type* = 0)
{
std::cout << "is_floating_point type " << t << "n";
}
void analyze(bool t)
{
std::cout << "is bool type " << t << "n";
}
};
提前感谢!
就像任何模板化方法一样:
struct node {
template <class T>
void analyze(T t, typename std::enable_if<std::is_integral<T>::value>::type* = 0);
};
template <class T>
void node::analyze(T t, typename std::enable_if<std::is_integral<T>::value>::type*) {
std::cout << "is_arithmetic type " << t << "n";
}
请注意,此处没有模板专用化(不能对成员函数进行部分专用化),并且具有不同的重载。
我会编写不同的帮助程序函数和标记调度。
template < class T >
void analyze(T t, int_tag);
template < class T >
void analyze(T t, float_tag );
void analyze(bool t, bool_tag );
template<class T>
auto get_tag();
void analyze( T t ){ return analyze(t, get_tag<T>());
现在我们通过标签调度将重载路由(get_tag
)与重载分开。
如何定义标签(std::integral_constant
或struct int_tag
或tag<int>
或其他)取决于你;它们必须是相互不兼容和空的。
如何写get_tag
也取决于你; if constexpr
在 C++17 中,使用 或 static_if
或 SFINAE 或 C++11/14 中的性状类构造。
我认为get_tag
的定义是analyze
而不是实现接口的一部分;如果我们直接分离重载解决规则,则不要使用 enable,公开它,然后将业务逻辑的实现放在其他地方。
我认为匿名默认模板参数是更好的解决方案,因为您不必将enable_if条件复制两次。
struct node
{
template <class T, typename = std::enable_if_t<std::is_integral_v<T>>>
void analyze( T t );
};
template <class T, typename>
void node::analyze( T t )
{
std::cout << "is_arithmetic type " << t << "n";
}
我知道它不适合具体的例子,因为它确实回答了这个问题。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- C++声明和定义之间拆分默认参数值
- 在C++中用字符串数组拆分声明和赋值
- 如何在声明和定义中拆分静态lambda
- 如何将__DATE__和__TIME__宏拆分为变量声明的单独组件
- 如何使用 std::enable_if 时拆分声明和实现
- 拆分函数的声明和定义,还是删除标头中的新运算符?
- 我应该始终将文件拆分为声明(.h)和定义(.cpp)吗
- 拆分定义和声明时,定义不同的异常说明符
- 使用前声明的历史原因,包括和头/源拆分.需要找到合适的参考资料