gpt4 book ai didi

c++ - 如何使用 C++ 模板创建具有任意数量 case 的 switch 语句生成器?

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:27 25 4
gpt4 key购买 nike

Switch 语句可能很长,所以我编写了以下类(在 main() 中使用示例):

#include <iostream>
using namespace std;

template <typename In, typename Out, In In1, Out Out1, In In2, Out Out2, Out DefaultOut>
struct SwitchMap
{
Out operator[](const In& input) const
{
switch (input) {
case In1: return Out1;
case In2: return Out2;
default: return DefaultOut;
}
}
};

int main(int, char **)
{
SwitchMap<unsigned int, unsigned int, 3, 1, 4, 2, 3> myMap;

cout << myMap[3] << endl; // prints 1
cout << myMap[4] << endl; // prints 2
cout << myMap[5] << endl; // prints 3

return 0;
}

我想实现两个目标:1. 我想让 SwitchMap 接受任意数量的情况(Outs 的数量比 Ins 的数量大 1 以提供默认返回值)。我的示例仅适用于两个输入、两个输出和一个默认输出。2. map是否可以申报?看起来像这样:SwitchMap<3, 1, 4, 2, 3> myMap; ?如果可以自动推导类型,那就太好了(尽管我意识到这可能会导致编译器选择 int 而不是我愿意处理的 unsigned int )。

我能否实现其中一个或两个目标?

最佳答案

这是一个使用 if 语句的例子。请注意,一个好的编译器将生成与开关一样高效的代码。结果也是constexpr。

#include <iostream>

template <typename T, T DEF>
inline constexpr T SwitchMap_helper(T) {
return DEF;
}

template <typename T, T IN, T OUT, T... REST>
inline constexpr T SwitchMap_helper(T v) {
return v == IN ? OUT : SwitchMap_helper<T, REST...>(v);
}

template <typename T, T... CASES>
struct SwitchMap {
constexpr T operator[](T v) {
return SwitchMap_helper<T, CASES...>(v);
}
};

int
main() {

SwitchMap<int, 1, 2, 3, 4, 5> sm1;
std::cout << sm1[1] << std::endl;
std::cout << sm1[3] << std::endl;
std::cout << sm1[10] << std::endl;
}

关于c++ - 如何使用 C++ 模板创建具有任意数量 case 的 switch 语句生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555497/

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