如何在可变参数函数中模拟褶皱表达式
how to emulate fold expression in variadic function?
似乎Microsoft支持折叠表达式的速度很慢,我正在努力寻找一种模拟它的方法。我有以下削减示例。这无法在Visual Studio 2017上编译,因为不支持Fold Expressions。知道如何模仿它吗?
template<typename... Args>
void get(weak_ptr<sqlite::database> awdb_, Args&&... args) {
(*awdb_.lock() << ... << args);
}
在折叠表达式之前,有一个扩展器技巧:
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)...);
}
}
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- G锁定铸造到基础上会释放模拟行为
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 落砂模拟碰撞检测C++和SFML
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 在gtest.中使用fff.h模拟系统API
- 如何在可变参数函数中模拟褶皱表达式