繁体   English   中英

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

[英]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();
};

直播godbolt.org链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM