C ++中的编译时条件成员函数调用

时间:2012-07-06 14:07:21

标签: c++ templates c++11

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

2 个答案:

答案 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。这意味着通过检查添加一个的值,我们知道。

注意:不要使用它。提出它很有趣,但上面的答案很多,很多

MUCH

更好。别用这个。请。