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

compile-time conditional member function call in C++

本文关键字:条件 成员 函数调用 编译 C++      更新时间:2023-10-16

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

首先,你不能像这样使用 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"
}

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

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

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 加到 int 将递增 1。这意味着通过检查加一的值,我们知道。

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

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