![](/img/trans.png)
[英]Testing endianess at compile-time: is this constexpr function correct according to the standard?
[英]Different member function definition according to compile-time condition
按照这个答案 ,我一直在使用
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)
的特定重载仅用于特定的参数类型,但是当有多个具有相同原型/参数签名的重载时,则无法执行此操作,因为编译器不允许这样做:
// ...
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&)’
如果根据bool_verifier<T>()
返回true,需要classMember
具有不同的定义,那么正确的语法/成员声明是什么? 或者,是否可以从#if
预编译器条件语句中调用bool_verifier<T>
?
或者,是否可以从
#if
预编译器条件语句中调用bool_verifier<T>
?
不。 预处理程序先于其他任何东西运行,并且根本不了解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();
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.