我有一个模板类,如果模板参数满足某些条件,某些成员函数才有意义。例如,使用std::enable_if<>
我只能为这些情况定义它们,但我怎样才能有条件地调用它们?这是一个简短的例子
template<class T> class A
{
typename std::enable_if<std::is_floating_point<T>::value>::type a_member();
void another_member()
{
a_member(); // how to restrict this to allowed cases only?
}
};
答案 0 :(得分:9)
首先,你不能像那样使用SFINAE - 模板类型参数需要在函数上,而不是类。
完整的解决方案如下所示:
template<class T> class A
{
private:
template <class S>
typename std::enable_if<std::is_floating_point<S>::value>::type a_member() {
std::cout << "Doing something";
}
template <class S>
typename std::enable_if<!std::is_floating_point<S>::value>::type a_member() {
//doing nothing
}
public:
void another_member()
{
a_member<T>();
}
};
int main() {
A<int> AInt;
AInt.another_member();//doesn't print anything
A<float> AFloat;
AFloat.another_member();//prints "Doing something"
}
答案 1 :(得分:1)
尝试将其添加到类声明中:
typename std::enable_if<std::is_floating_point<T>, int*>::type a_enabled_p() { return 0;};
void another()
{
if((a_enabled_p()+1)==1)
{
//Not enabled
}
else if((a_enabled_p()+1)==sizeof(int))
{
//Is enabled
}
}
这就是为什么这种恐怖可能起作用的原因。如果它们是浮点数,则谓词的返回值为int*
。如果是,则没有typedef,默认为int
(我希望)。当您向int*
添加1时,您实际上正在添加sizeof(int)
。将1加1加1。这意味着通过检查添加一个的值,我们知道。
注意:不要使用它。提出它很有趣,但上面的答案很多,很多
更好。别用这个。请。