Мета-программирование шаблонов C ++ с использованием шаблонов variadi c для выполнения операций с определенными c членами структуры - PullRequest
3 голосов
/ 24 марта 2020

Я разработал этот метод, находя способ красиво абстрагировать связывание структуры с оператором SQL для оболочки SQLite, моя цель - уметь абстрагировать большую часть процесса связывания, а также иметь возможность "псевдонима" «шаблон специализированной функции, так что вам не нужно перепечатывать привязки при каждом использовании.

Метод, который я нашел, скомпилируется на clang, но в настоящее время я не могу заставить его работать как для G CC, так и для MSV C из-за использования ключевого слова auto это реплицируется в приведенном ниже примере с 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, но G CC не может определить тип авто, и в настоящее время я не нашел способа достичь своей цели без него, меньше это можно было бы сделать используя макросы.

1 Ответ

0 голосов
/ 24 марта 2020

Решение благодаря Сэму Варшавчику .

И MSV C, и G CC теперь смогли скомпилировать этот код и вывести автоматический тип, хотя для MSV C ты, муза, не забудь пройти

...