gpt4 book ai didi

c++ - 可变参数 lambda 捕获的解决方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:49 26 4
gpt4 key购买 nike

我在这里看到了一些与在 lambda 中捕获可变参数的 gcc 错误有关的问题。参见示例:Does lambda capture support variadic template argumentsCompiler bug, or non standard code? - Variadic template capture in lambda .我有以下我想做的人为的例子

#include <iostream>
#include <functional>

class TestVariadicLambda {
public:

template<typename... Args>
std::function<void()> getFunc(Args... args) {
return [=]{ printArgs(args...); };
}

template<typename T, typename... Args>
void printArgs(T value, Args... args) {
std::cout << value << ", ";
printArgs(args...);
}

void printArgs() {std::cout << "\n";}
};

在 gcc 4.8.2 中我得到以下错误:

../src/TestVariadicLambda.h: In lambda function:
../src/TestVariadicLambda.h:9:25: error: parameter packs not expanded with ‘...’:
return [=]{ printArgs(args...); };
^
../src/TestVariadicLambda.h:9:25: note: ‘args’
../src/TestVariadicLambda.h:9:29: error: expansion pattern ‘args’ contains no argument packs
return [=]{ printArgs(args...); };
^

我的问题是我该如何解决这个问题,因为它在 gcc4.8 中不起作用

最佳答案

以下将起作用。

#include <iostream>
#include <functional>
#include <vector>

std::string to_string(const char* s)
{
return s;
}

class Test
{
private:
void print() {}

public:
template<typename T, typename... Args>
void print(T value, Args... args)
{
std::cout << value << "\n";
print(args...);
}

template<typename... Args>
std::function<void()> getFunc(Args... args)
{
using namespace std;
std::vector<std::string> ArgumentList;
std::initializer_list<int> {(ArgumentList.push_back(to_string(args)), 0)...};
return [=] {for (const auto &t : ArgumentList){print(t);}};
}
};

int main()
{
Test().getFunc("Hey", 1, 2, 3.0f)();
}

关于c++ - 可变参数 lambda 捕获的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006574/

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