Any*_*orn 5 c++ variadic-templates
我正在尝试实例化一个函数表(以模拟switch)
template<size_t ... N>\n int f(std::index_sequence<N...>, int k)\n {\n static auto f_table = { []() { return N; }... };\n auto f = f_table.begin() + k;\n assert((*f)() == k);\n return (*f)();\n }\nRun Code Online (Sandbox Code Playgroud)\n\n失败了error: parameter packs not expanded with \xe2\x80\x98...\xe2\x80\x99:
我可以使用额外的包装函数,但是为什么 lambda 会失败,有解决方法吗?
\nGCC 不扩展 lambda 表达式中出现的模板参数包是一个错误,最终在 GCC 8 中修复。
注释中也提到了代码的另一个问题是列表中的每个 lambda{ []() { return N; }... }都有自己不同的类型,因此必须+首先使用运算符将它们转换为函数指针:
#include <utility>
#include <cassert>
template<std::size_t ... N>
int f(std::index_sequence<N...>, std::size_t k) {
static auto f_table = { +[]() { return N; }... };
auto f = f_table.begin() + k;
assert((*f)() == k);
return (*f)();
}
int main() {
f(std::make_index_sequence<3>{}, 2);
}
Run Code Online (Sandbox Code Playgroud)
演示: https: //gcc.godbolt.org/z/jWrfn7d6W