gpt4 book ai didi

c++ - 如何根据模板变量参数多次扩展语句

转载 作者:行者123 更新时间:2023-11-30 00:44:41 26 4
gpt4 key购买 nike

我有以下伪代码:

template <typename... Ts>
void f(int index) {
std::vector<std::function<void(void)>> funcs;

funcs.push_back([](){ std::cout << typeid(type_1).name() << std::endl; });
funcs.push_back([](){ std::cout << typeid(type_2).name() << std::endl; });
funcs.push_back([](){ std::cout << typeid(type_3).name() << std::endl; });
funcs.push_back([](){ std::cout << typeid(type_4).name() << std::endl; });

funcs[index]();
}

假设 Ts... 参数包包含 type_1type_2type_3 type_4.

我怎样才能扩展参数包以达到这样的效果?我的意思是 - 如果模板包中有 4 个参数,并且在不同的 lambda 中也有不同的类型,我如何获得 4 个 push_back() 调用?我不知道语法..

我真的可以在编译时获得某种此类函数的数组,因此在运行时没有 push_backs 吗?

C++17 解决方案还可以,但 C++14 是最好的。

最佳答案

对于 C++17,我想是这样的

(funcs.push_back([](){ std::cout << typeid(Ts).name() << std::endl; }), ...);

或者,更好(恕我直言),使用 emplace_back()

(funcs.emplace_back([](){ std::cout << typeid(Ts).name() << std::endl; }), ...);

但请记住这是

std::vector<std::function<void(void)>>

不是

std::vector<std::function<void>>

在 C++14(和 C++11)中,您可以通过初始化未使用数组的技巧获得类似的东西;该函数可以写成

template <typename ... Ts>
void f (int index)
{
using unused = int[];

std::vector<std::function<void(void)>> funcs;

(void)unused { 0, (funcs.emplace_back([]()
{ std::cout << typeid(Ts).name() << std::endl; }), 0)... };

funcs[index]();
}

关于c++ - 如何根据模板变量参数多次扩展语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499405/

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