gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:26:31 28 4
gpt4 key购买 nike

根据 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) 的特定过载仅用于特定的参数类型,但当存在具有相同原型(prototype)/参数签名的多个重载时不可能这样做,因为编译器不允许这样做:

// ...
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>()返回 true,正确的语法/成员声明是什么?或者,有没有办法调用 bool_verifier<T>来自 #if预编译条件语句?

最佳答案

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

live godbolt.org link

关于c++ - 根据编译时条件定义不同的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522743/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com