C++ 模板运算符重载 std::enable_if
c++ template operator overloading std::enable_if
我在编译此模板时遇到问题。我只想创建一个运算符,其功能取决于数据类型(int 或 float(。我不是专家,所以我将不胜感激任何帮助。
template <class T> struct eq {
typename std::enable_if<std::is_floating_point<T>::value, T>::type
operator() (const T& x, const T& y) const {
T* paux;
if(sizeof(T) == 4){ //float
uint32_t val = 0;
if(x == y){
val = ~val;
T* paux = reinterpret_cast<T*>(&val);
return *paux;
}
else{
T* paux = reinterpret_cast<T*>(&val);
return *paux;
}
}
else{ //double
uint64_t val = 0;
if(x == y){
val = ~val;
T* paux = reinterpret_cast<T*>(&val);
return *paux;
}
else{
T* paux = reinterpret_cast<T*>(&val);
return *paux;
}
}
}
typename std::enable_if<std::is_integral<T>::value, T>::type
operator() (const T& x, const T& y) const {
return (x==y) ? ~((T)(0)) : ((T)(0));
}
};
错误代码:
clases.cpp:66:3: error: ‘typename std::enable_if<std::is_integral<_Tp>::value, T>::type eq<T>::operator()(const T&, const T&) const’ cannot be overloaded
operator() (const T& x, const T& y) const {
^
clases.cpp:38:3: error: with ‘typename std::enable_if<std::is_floating_point<_Tp>::value, T>::type eq<T>::operator()(const T&, const T&) const’
operator() (const T& x, const T& y) const {
SFINAE 仅在模板参数位于模板的直接上下文中时才发生。一个简单的解决方法是将operator()
函数转换为具有默认参数的模板函数:
template <class T> struct eq {
template<typename U=T>
typename std::enable_if<std::is_floating_point<U>::value, U>::type
operator() (const T& x, const T& y) const {
//...
}
template <typename U=T>
typename std::enable_if<std::is_integral<U>::value, U>::type
operator() (const T& x, const T& y) const {
//...
}
};
也许一个稍微干净的解决方案是提供两个eq
的部分特化;一个用于浮点类型,一个用于整型类型:
template <class T, typename=void> struct eq;
template <class T>
struct eq<T, typename std::enable_if<std::is_floating_point<T>::value>::type> {
T operator() (const T& x, const T& y) const {
//...
}
};
template <class T>
struct eq<T, typename std::enable_if<std::is_integral<T>::value>::type> {
T operator() (const T& x, const T& y) const {
//...
}
};
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- SFINAE with boost enable if