根据编译时条件定义不同的成员函数
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();
};
根据
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();
};