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), ...);
}