C++ 通过Lambdas解包可变参数

C++ 通过Lambdas解包可变参数,c++,c++11,lambda,C++,C++11,Lambda,我试图避免外部函数或递归调用,所以我决定测试lambdas的功能,但我被卡住了。我该如何打开Args。。。如果可能,使用lambdas 我尝试使用std::tie将参数转换为tuple,然后尝试使用std::get,其中我是一个非常量整数,但失败了,因为get需要一个constexpr 我还尝试了初始化列表,我知道这会失败,但值得一试。我不想用维基百科的方式。我想这样做: 有什么想法或者我注定要失败 template<typename... Args> void fcout(cons

我试图避免外部函数或递归调用,所以我决定测试lambdas的功能,但我被卡住了。我该如何打开Args。。。如果可能,使用lambdas

我尝试使用std::tie将参数转换为tuple,然后尝试使用std::get,其中我是一个非常量整数,但失败了,因为get需要一个constexpr

我还尝试了初始化列表,我知道这会失败,但值得一试。我不想用维基百科的方式。我想这样做:

有什么想法或者我注定要失败

template<typename... Args>
void fcout(const char* s, Args... args)
{
    std::function<void(Args... A)> Unpack = [&](Args... A) {
        //Unpack(A...);
    };

    while (*s)
    {
        if (*s == '%')
        {
            if (*(s + 1) == '%')
            {
                ++s;
            }
            else
            {
                Unpack(args...);
                fcout(s + 1, args...);
                return;
            }
        }
        std::cout << *s++;
    }
}

如果我正确理解了您想要实现的目标,您可以使用以下简单技巧:

std::function<void(Args... A)> Unpack = [&](Args... A) {
    auto l = {((std::cout << A), 0)...};
};

调用Unpack函数对象将导致将所有参数插入std::cout,并因此打印到标准输出。

如果我正确理解您试图实现的目标,您可以使用以下简单技巧:

std::function<void(Args... A)> Unpack = [&](Args... A) {
    auto l = {((std::cout << A), 0)...};
};

调用解包函数对象将导致将所有参数插入std::cout,从而打印到标准输出。

我试图避免使用可变模板的外部函数或递归调用;外部函数调用和递归即将发生。最好现在就接受它们。好的,但我可以用递归lambda吗?或者是FrRoad或者某种C++魔法,可能根本不存在……我不确定我理解你想要达到的目标。你能谈谈你的目标是什么吗?做一个。。。正在解包A…我想访问lambda中A的每个值。它没有打开包装。它只是通过整个事情,所以我不能做std::coutOnce你知道你想对每一个做什么,其余的不太难。所以你要做的就是做std::cout我试图避免使用可变模板的外部函数或递归调用;外部函数调用和递归即将发生。最好现在就接受它们。好的,但我可以用递归lambda吗?或者是FrRoad或者某种C++魔法,可能根本不存在……我不确定我理解你想要达到的目标。你能谈谈你的目标是什么吗?做一个。。。正在解包A…我想访问lambda中A的每个值。它没有打开包装。它只是通过整个事情,所以我不能做std::coutOnce你知道你想对每一个做什么,其余的不太难。所以你要做的就是做std::cout:O这已经足够接近了。我真的很想得到每一个论点,但我对此感到高兴。我会把它放进一条小溪里。这就够了。@CantChooseServerNames:好的,很高兴它有帮助::O这已经足够近了。我真的很想得到每一个论点,但我对此感到高兴。我会把它放进一条小溪里。这就够了。@CantChooseServerNames:好的,很高兴它有帮助: