所以在模板类中,我试图根据静态提供的一些信息来实例化不同的成员。在下面的模板中,如果某些条件成立,则selectiveMember
包含在SelectiveClass
中,否则,模板将在没有selectiveMember
的情况下实例化,但仍包含foo
。< / p>
template<typename T>
struct SelectiveClass{
void foo(){...}
template<condition_check<T>::type=0>
void selectiveMember{...}
}
但是,如果不满足条件,这种实现将丢弃整个类。然而,使用CRTP技术,我们可以达到目的。
template<typename T>
struct SelectiveClass: Specialize<T>{
void foo(){...}
}
template<typename T>
struct Specialize{
template<condition_check<T>::type=0>
void selectiveMember{...}
}
但是使用这种技术,每个选择性成员都需要另一个专门的继承。
所以我的问题是:是否有更优雅的方式来允许这种选择性成员模板?
答案 0 :(得分:2)
您的enable_if
无法按您希望的方式工作的原因是因为它没有在立即上下文中使用(例如,参见here)。但是,如果在selectiveMember
函数中插入默认模板参数,则可以实现所需的功能。在下面的示例中,我使用的是condition
的具体示例,但是您可以用自己的示例替换它。
#include <type_traits>
template<typename T>
struct SelectiveClass{
void foo(){}
template <class X = T, std::enable_if_t<std::is_integral<T>::value, X>* = nullptr>
void selectiveMember(){}
};
using test_int = SelectiveClass<int>;
using test_double = SelectiveClass<double>;
int main() {
test_int x;
test_double y;
x.selectiveMember();
// y.selectiveMember(); fails to compile as expected
}