gpt4 book ai didi

C++ std::enable_if 回退?

转载 作者:行者123 更新时间:2023-12-01 15:10:42 26 4
gpt4 key购买 nike

我正在设置一个可变参数模板函数,以便能够在特定系列的类上调用各种函数重载。到目前为止,我已经能够在将不受支持的类传递给函数时“中断”编译,但我希望能够提供有效的回退以在运行时处理“不受支持”的情况。

当前的实现是这样的:

struct ClassA {};
struct ClassB {};
struct ClassC {};

template<typename T> struct is_my_class : std::false_type {};
template<> struct is_my_class<ClassA> : std::true_type {};
template<> struct is_my_class<ClassB> : std::true_type {};

template<typename T>
constexpr bool is_my_class_v = is_my_class<T>::value;

void runOverload(ClassA c) { printf("ClassA overload\n"); }
void runOverload(ClassB c) { printf("ClassB overload\n"); }

template<typename T, typename = std::enable_if_t<is_my_class_v<T>>>
void run(T myClass)
{
runOverload(myClass);
};

template<typename T, typename... Ts>
void run(T myClass, Ts... classesLeft)
{
run(myClass);
run(classesLeft...);
};

int main()
{
ClassA a;
ClassB b;
ClassC c;

run(a, b); // works
run(c); // does not compile
}

在这里,我为 run 做出的两个最有希望(但仍然失败)的尝试:

1 - 添加一个简单的 !is_my_class<T> 前,给我以下错误:error C2995: 'void run(T)': function template has already been defined

template<typename T, typename = std::enable_if_t<!is_my_class_v<T>>>
void run(T myClass)
{
printf("Not supported\n");
};

2 - 制作一个更“主要”的模板定义,这会产生一个悲伤但明显的结果:error C2668: 'run': ambiguous call to overloaded function

template<typename T>
void run(T myClass)
{
printf("Not supported\n");
};

编辑我忘了说明我正在寻找一个也与 C++11/14 兼容的解决方案

最佳答案

您可以完全避免 enable_if,而只需使用编译时 if 来决定要执行的代码:

template<typename T>
void run(T myClass)
{
if constexpr (is_my_class_v<T>)
runOverload(myClass);
else
printf("Not supported\n");
}

这是一个 demo .

关于C++ std::enable_if 回退?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61526391/

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