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

时间:2018-11-28 15:20:34

标签: c++ c++11 templates typetraits overloading

根据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

1 个答案:

答案 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();
};

live godbolt.org link