c++ - C++ 模板元编程,使用可变参数模板执行结构特定成员的操作
问题描述
我开发了这种方法,同时找到了一种将结构很好地抽象绑定到 SQLite 包装器的 SQL 语句的方法,我的目标是能够抽象出大部分绑定过程以及能够“别名”专用函数模板这样您就不需要在每次使用时重新键入绑定。
auto
我找到的方法将在 clang 上编译,但由于使用了在下面的示例中复制的关键字,我目前无法让它同时适用于 GCC 和 MSVC add_2
。
例子:
// final function to perform the addition on each member
template<class T, class M>
void add2_member(T& value, M member)
{
value.*member += 2;
}
// variadic template function that unpack the Members and calls add2_member for each
// arg in args using c++17 fold syntax.
template<class T, auto T::*... Members>
void add2(T& value)
{
(add2_member(value, Members), ...);
}
// example struct X
struct X
{
int a;
int b;
char c;
};
// alias add2 function specialisation
auto add2_x = add2<X, &X::a, &X::c>;
int main()
{
X x;
x.a = 2;
x.c = 1;
add2_x(x);
}
显示这项工作的实时链接在这里,它显示了 godolt 使用 Clang 9 编译的示例,但是 GCC 无法推断出汽车的类型,我目前还没有找到一种方法来实现我的目标,这可能是使用宏完成。
解决方案
感谢Sam Varshavchik的解决方案。
MSVC 和 GCC 现在都能够编译这段代码并推断出 auto 类型,不过对于 MSVC,你记得要传递/Zc:auto
.
template<class T, class M>
void add2_member(T& value, M member)
{
value.*member += 2;
}
template<class T, auto ... Members>
void add2(T& value)
{
(add2_member(value, Members), ...);
}
推荐阅读
- npm - Fork 并安装 Create React App 而不在 NPM 上发布
- fiware-orion - 如何在 Orion Context Broker 注册到 Context Provider 时包含 fiware-service 和 fiware-servicePath 标头?
- arrays - 如何在 Google 表格中对行进行排序
- javascript - 箭头功能不触发
- encryption - 如何在不调用 HashiCorp 保险库的情况下进行非对称加密?
- java - 向 Camel 路由添加延迟会导致 Atomikos 超时
- angular - 如何将计数器值传递给 AlertController 的标头
- c - 为什么这个简单的乘法函数在 Main 中调用时不返回任何内容?
- python - 根据每个 id 的阈值日期在 pandas 中选择行
- parsing - Haskell - 带状态的 Parsec