gpt4 book ai didi

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

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

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/

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