c++ - 将 int 映射到 Template int
问题描述
有没有比这个更优雅的解决方案(对于一个希望显而易见的问题)
switch(variableInt)
{
case 0: tmpl<0>::foo(); break;
case 1: tmpl<1>::foo(); break;
// up to, say, 10
}
显然,这只能在某个范围内定义。我只找到了关于这个的老话题,也许是一些很好的 C++17 或 C++20 特性可以帮助我们?
解决方案
这样的事情呢?
#include <utility>
template <std::size_t I>
int foo(int arg) {
return I * arg;
}
template<std::size_t ...Is>
auto get_foo(std::index_sequence<Is...>, int i) {
return *(std::initializer_list<int(*)(int)>{&foo<Is>...}.begin() + i);
}
int foo(std::size_t i, int arg) {
return get_foo(std::make_index_sequence<11>(), i)(arg);
}
这是另一个优化得更好的解决方案:
#include <utility>
template <std::size_t I>
int foo(int arg) {
return I * arg;
}
template<std::size_t ...Is>
auto foo(std::index_sequence<Is...>, int i, int arg) {
int ret;
((Is == i && (ret = foo<Is>(arg))), ...);
return ret;
}
int foo(std::size_t i, int arg) {
return foo(std::make_index_sequence<11>(), i, arg);
}
推荐阅读
- angularjs - 从外部 javascript 正确访问 django 静态文件
- html - 本地字体仅在 iPhone 和我的同事 Mac 上不显示
- javascript - infowindow.close() 无法使用 reactjs 在谷歌地图上工作
- javascript - 如何使用javascript中的GET方法在ajax调用中传递数据
- java - 手动将控制器创建的跟踪连接到 Sleuth 中的不同跟踪
- sonarqube - 是否建议对标准 JS 文件(如 bootstrap.js、jquery-1.10.2.js、highcharts.src.js 等)进行更改以关闭声纳观测
- c# - 在用户控件中公开控件的 itemsource 属性
- excel - 在M语言excel中显示两个日期之间的所有日期
- python - 在单个字符串中打印熊猫行(jupyter notebook)
- android - 使用随相机位置旋转的平板电脑拍照