【发布时间】:2018-08-22 08:15:18
【问题描述】:
我需要为 const 和非常量类型实现两种不同的方法。我已经设法编写了工作代码,但我不明白为什么它的某些风格可以,而有些则不行。
这是一个简化的例子,我想知道为什么 #1 有效,但 #2 无效,关于 #3 和 #4 也是如此:
#include <iostream>
#include <vector>
template <typename T>
class X {
public:
// #1 - works
template<typename B = T, typename std::enable_if<std::is_const<B>::value, int>::type = 0>
void foo() {std::cout << "CONST" << std::endl;}
template<typename B = T, typename std::enable_if<std::is_const<B>::value == false, int>::type = 0>
void foo() {std::cout << "NON-CONST" << std::endl;}
// #2 - does not work "no type named 'type' in 'std::__1::enable_if<false, int>'; 'enable_if' cannot be used to disable this declaration"
// template<typename std::enable_if<std::is_const<T>::value, int>::type = 0>
// void foo() {std::cout << "CONST" << std::endl;}
// template<typename std::enable_if<std::is_const<T>::value == false, int>::type = 0>
// void foo() {std::cout << "NON-CONST" << std::endl;}
// #3 - works
// template<typename B = T, typename = typename std::enable_if<std::is_const<B>::value>::type>
// void foo() {std::cout << "CONST" << std::endl;}
// template<typename B = T, typename std::enable_if<std::is_const<B>::value == false>::type * = nullptr>
// void foo() {std::cout << "NON-CONST" << std::endl;}
// # 4 - does not work - "class member cannot be redeclared"
// template<typename B = T, typename = typename std::enable_if<std::is_const<B>::value>::type>
// void foo() {std::cout << "CONST" << std::endl;}
// template<typename B = T, typename = typename std::enable_if<std::is_const<B>::value == false>::type>
// void foo() {std::cout << "NON-CONST" << std::endl;}
};
int main() {
X<int> v;
X<const int> vConst;
v.foo();
vConst.foo();
return 0;
}
即使有更好的方法来解决我的问题,我也真的很想了解为什么 enable_if 像它一样(而不是)在给出的示例中起作用。
【问题讨论】:
-
只是风格问题,但更喜欢
!condition而不是condition == false... -
@Aconcagua:当然,我通常使用
!condition,但不幸的是模板代码可能非常复杂,以至于condition == false对我来说更加可见/可读。 -
或者,可能是更好的重复匹配:stackoverflow.com/q/6972368/580083
-
旁注:如果在非模板函数中使用 constexpr 可能更容易解决问题(仅适用于您不知道的情况......)。