1

我有一个模板类,它的某些成员函数只有在模板参数满足某些条件时才有意义。使用,例如,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?
   }
};
4

2 回答 2

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"
}
于 2012-07-06T14:19:36.110 回答
1

警告:这是一个完整的、可怕的 hack,我没有尝试过它可能永远不会奏效。

尝试将其添加到类声明中:

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(我希望)。当您将 1 添加到 时int*,您实际上是在添加sizeof(int)。将 1 添加到 int 会增加 1。这意味着通过检查加一的值,我们知道。

注意:不要使用这个。想出来很有趣,但上面的答案是很多,很多

很多

更好的。不要使用这个。请。

于 2012-07-06T14:23:16.477 回答