根据this answer,我一直在使用
template <typename T,
typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);
作为几个类成员的函数签名,其中bool_verifier<T>()
是一个模板化函数,它断言特定类T
满足某些要求,返回类型为constexpr bool
。这样可以确保classMember(const T& arg)
的特定重载仅用于特定的参数类型,但是当存在多个具有相同原型/参数签名的重载时,则无法执行此操作,因为编译器不允许这样做: / p>
// ...
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
是否返回true,我需要bool_verifier<T>()
具有不同的定义,那么正确的语法/成员声明是什么?另外,是否可以从bool_verifier<T>
预编译器条件语句中调用#if
?
答案 0 :(得分:2)
或者,是否可以从
bool_verifier<T>
预编译器条件语句中调用#if
?
不。预处理程序先运行,并且根本不了解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();
};