gpt4 book ai didi

c++ - 根据运行时参数执行整数模板函数

转载 作者:可可西里 更新时间:2023-11-01 18:35:31 25 4
gpt4 key购买 nike

我经常有一些原型(prototype)行为会根据一些设计方法生成输出。我模板化了设计方法,它启用了我需要的很多功能。然而,有时设计方法是在运行时给出的,所以我通常需要写一个巨大的 switch 语句。它通常看起来像这样:

enum class Operation
{
A, B
};


template<Operation O>
void execute();

template<>
void execute<A>()
{
// ...
}

template<>
void execute<B>()
{
// ...
}

void execute(Operation o)
{
switch (o)
{
case Operation::A: return execute<Operation::A>();
case Operation::B: return execute<Operation::B>();
}
}

我很好奇是否有人为这个系统找到了一个很好的模式 - 这种方法的主要缺点是必须输入所有支持的枚举,并且如果实现了新的枚举,则必须在几个地方进行维护。

e:我应该补充一点,搞乱编译时模板的原因是允许编译器在 HPC 中内联方法以及继承 constexpr 属性。

e2:实际上,我想我要问的是让编译器使用隐式开关结构生成所有可能的代码路径。也许是一些递归模板魔法?

最佳答案

如果你真的想为这个任务使用模板,你可以使用类似于 this one 的技术。 .

// Here second template argument default to the first enum value
template<Operation o, Operation currentOp = Operation::A>
// We use SFINAE here. If o is not equal to currentOp compiler will ignore this function.
auto execute() -> std::enable_if<o == currentOp, void>::type
{
execute<currentOp>();
}

// Again, SFINAE technique. Compiler will stop search if the template above has been instantiated and will ignore this one. But in other case this template will be used and it will try to call next handler.
template<Operation o, Operation currentOp = Operation::A>
void execute()
{
return execute<o, static_cast<Operation>(static_cast<int>(currentOp) + 1)(c);
}

关于c++ - 根据运行时参数执行整数模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39942813/

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