C++ 模板元编程,使用可变参数模板来执行结构的特定成员的操作
C++ Template Meta-programming, with variadic templates to perform an operation of specific members of a structure
我开发了这个方法,同时找到了一种很好地抽象绑定结构到 SQL 语句的 SQLite 包装器的方法,我的目标是能够抽象出大部分绑定处理以及能够 "alias" 专用函数模板,这样您就不需要在每次使用时重新键入绑定。
我找到的方法将在 clang 上编译,但由于使用了 auto
关键字,我目前无法让它同时适用于 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);
}
一个 live link 展示这个作品是 here 它展示了用 Clang 9 编译的 godolt 中的例子,但是 GCC 无法推断出 auto 的类型,我目前还没有找到没有它就可以实现我的目标的方法,这可以使用宏来完成。
感谢 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), ...);
}
我开发了这个方法,同时找到了一种很好地抽象绑定结构到 SQL 语句的 SQLite 包装器的方法,我的目标是能够抽象出大部分绑定处理以及能够 "alias" 专用函数模板,这样您就不需要在每次使用时重新键入绑定。
我找到的方法将在 clang 上编译,但由于使用了 auto
关键字,我目前无法让它同时适用于 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);
}
一个 live link 展示这个作品是 here 它展示了用 Clang 9 编译的 godolt 中的例子,但是 GCC 无法推断出 auto 的类型,我目前还没有找到没有它就可以实现我的目标的方法,这可以使用宏来完成。
感谢 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), ...);
}