gpt4 book ai didi

C++模板实例化: Avoiding long switches

转载 作者:IT老高 更新时间:2023-10-28 22:33:39 25 4
gpt4 key购买 nike

我有一个依赖于整数模板参数的类。在我的程序中,我想使用此模板的一个实例化,具体取决于在运行时确定的此参数的值。下面是一个简单的例子,展示了我目前将如何使用一个大的 switch 语句来处理这个问题:

#include <string>
#include <iostream>
#include <type_traits>

template<unsigned A>
struct Wrapper {
typedef typename std::conditional<A==1, int, float>::type DataType;
DataType content[A];
void foo() {
std::cout << A << std::endl;
};
};

int main(int argc, char *argv[])
{
std::string arg = argv[1];
int arg_int = std::stoi(arg);

switch (arg_int) {
case 1: {
Wrapper<1> w;
w.foo();
break;
}
case 2: {
Wrapper<2> w;
w.foo();
break;
}
case 3: {
Wrapper<3> w;
w.foo();
break;
}
default:
return 1;
};

return 0;
}

一旦我不仅有一个参数A,而且有多个不同组合的模板参数,这将很快变得笨拙。我们还假设实际上有一个很好的理由将 A 实现为模板参数。

有没有办法用几乎相同的 case 语句替换巨大的 switch 语句,例如使用一些来自 Boost 的元编程魔法或预处理器技巧?

理想情况下,我希望能够编写如下内容:

INSTANTIATE_DEPENDING(i, {1, 2, 3},
{
Wrapper<i> w;
w.foo();
}
);

最佳答案

您可以使用可变参数模板,可能是这样的:

#include <cstdlib>
#include <string>

int main(int argc, char * argv[])
{
if (argc != 2) { return EXIT_FAILURE; }

handle_cases<1, 3, 4, 9, 11>(std::stoi(argv[1]));
}

实现:

template <int ...> struct IntList {};

void handle_cases(int, IntList<>) { /* "default case" */ }

template <int I, int ...N> void handle_cases(int i, IntList<I, N...>)
{
if (I != i) { return handle_cases(i, IntList<N...>()); }

Wrapper<I> w;
w.foo();
}

template <int ...N> void handle_cases(int i)
{
handle_cases(i, IntList<N...>());
}

关于C++模板实例化: Avoiding long switches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25202250/

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