根据编译时条件定义不同的成员函数

Different member function definition according to compile-time condition

根据 ,我一直在使用

template <typename T,
          typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);

作为几个 class 成员的函数签名,其中 bool_verifier<T>() 是一个模板函数,断言特定的 class T 满足某些要求,return 输入 constexpr bool。这确保了 classMember(const T& arg) 的特定重载仅用于特定参数类型,但是当存在具有相同 prototype/argument 签名的多个重载时不可能这样做,因为编译器不允许这样做:

// ...
template <typename T, typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);
template <typename T,  typename = typename enable_if<!(bool_verfier<T>())>::type>>
classMember(const T& arg);
// ...

这会导致以下编译错误:

 ‘template<class T, class> void myClass::classMember<T>(const T&)’
 cannot be overloaded with
‘template<class T, class> void std::myClass<T>::classMember(const T&)’

如果我需要 classMember 根据 bool_verifier<T>() return 是否为真有不同的定义,那么正确的 syntax/member 声明是什么?或者,有没有办法从 #if 预编译器条件语句调用 bool_verifier<T>

Alternatively, is there a way to call bool_verifier<T> from an #if precompiler conditional statement?

没有。预处理器先于其他任何东西运行,并且根本不了解 C++。


您可能需要使用额外的模板参数(或通过更改 enable_if 出现的位置)来消除两个重载之间的歧义,因为默认模板参数值不是签名的一部分。以下对我有用:

struct foo
{
     template <typename T, typename = std::enable_if_t<bool_verifier<T>{}>> 
     void a();

     template <typename T, typename = std::enable_if_t<!bool_verifier<T>{}>, typename = void> 
     void a();
};

live godbolt.org link