c++ - 如何模拟可变参数函数中的折叠表达式?

标签 c++ visual-c++ variadic-templates

Microsoft 似乎对 Fold Expressions 的支持很慢,我正在努力寻找一种方法来模拟它。我有以下缩减示例。由于不支持折叠表达式,因此无法在 Visual Studio 2017 上编译。 知道如何模拟吗?

template<typename... Args>
void get(weak_ptr<sqlite::database> awdb_, Args&&... args) {
    (*awdb_.lock() << ... << args);
}

最佳答案

在折叠表达式之前,有一个 expander trick :

template <class... Args>
void get(weak_ptr<sqlite::database> awdb_, Args&&... args) {
    if (auto db = awdb_.lock()) {
        using expander = int[];
        (void)expander{0,
            (void(*db << std::forward<Args>(args)), 0)...
        };
    }
}

作为 T.C.指出,如果 << 这不一定严格等同除了返回 *this 之外还做了其他事情回来,所以我们可以写:

template <class F, class Arg>
decltype(auto) fold(F&& , Arg&& arg) {
    return std::forward<Arg>(arg);
}

template <class F, class A0, class A1, class... Args>
decltype(auto) fold(F&& f, A0&& a0, A1&& a1, Args&&... args) {
    return fold(f, f(a0, a1), std::forward<Args>(args)...);
}

template <class... Args>
void get(weak_ptr<sqlite::database> awdb_, Args&&... args) {
    if (auto db = awdb_.lock()) {
        auto lshift = [](auto&& a, auto&& b) -> decltype(auto) { return a << std::forward<decltype(b)>(b); };
        fold(lshift, *db, std::forward<Args>(args)...);
    }
}    

关于c++ - 如何模拟可变参数函数中的折叠表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212636/

相关文章:

c++ - 重载可变参数模板的固定参数

c++ - VS2010 中的标准智能感知

c++ - 将参数包传递给别名模板(具有非包参数)的解决方法

c++ - 为什么不调用移动构造函数?

c++ - 修复 LNK2019 : unresolved external symbol with freeglut

c++ - 模数是否溢出?

c++ - 空包可变参数模板

c++ - 仅在构建框架时架构 arm64 的 undefined symbol

windows - C++ CreateFile 和 fopen 函数抢先读取整个远程文件

C++11 转换可变参数模板以推导类类型