c++ - 通过 Lambda 解压可变参数

标签 c++ c++11 lambda

我试图避免外部函数或递归调用,因此我决定测试 lambda 的强大功能,但我陷入了困境。我该如何拆包Args...如果可能的话使用 lambda 吗?

我尝试做 std::tie为了将参数放入元组中,然后我尝试使用 std::get<I>哪里I是一个非常量整数,但它失败,因为 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中(因此,打印到标准输出)。

关于c++ - 通过 Lambda 解压可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15735925/

相关文章:

python - 在 C 和 Python 之间传递 C++ 指针

c++ - Q_ENUMS 和 using 声明不能一起工作

c# - 反射 v 表达

c++ - 测量 std::function 的性能成本

C++ 线程构造函数,使用 new(object) 会造成内存泄漏

java - C++/JNI - 存储对象 (jobject) 在 vector 和数组中意外更改,C++ 或 JNI 问题?

c# - 为什么这个 LINQ 表达式会破坏我的循环和转换逻辑?

c++ - 从抽象类 C++ 继承对象的数组

c++ - 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error>>

c++ - 理解 std::function 的晦涩模板参数