мета-функция c ++, возвращающая тип - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь создать мета-функцию, которая возвращает тип. Вдохновение пришло от первого принятого ответа в мета-функции C ++ над шаблонами . Я хочу, чтобы моя мета-функция возвращала тип char, а затем я хочу использовать этот вывод для создания переменной типа char. Я считаю, что мой шаблон работает, но я не знаю, как проверить вывод. Я не смог распечатать его. Как проверить, что является возвращаемым типом? Как использовать этот возвращаемый тип для создания переменной?

Это обобщенная версия моего кода:

template<typename T> struct AA;
// allow for shorter syntax - decl<...>
template<typename T> using decl = typename AA<T>::result;

// char termination
template<ExprType eType>
struct AA<Expr<eType>> { using result = char; };

...other templates that specialize and allow for recursion

int main()
{
    decl<..many args..> typee;

    return 0;
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Мой обычный метод - объявить фиктивный шаблон класса:

template <class...>
struct check_type;

И использовать его таким образом, чтобы вызвать ошибку:

check_type<decltype(typee)>{};

Таким образом, тип того, что я пройденный появляется в выводе компилятора:

prog.cc: In function 'int main()':
prog.cc:8:18: error: invalid use of incomplete type 'struct check_type<int>'
    8 |  check_type<int>{};
      |                  ^
compilation terminated due to -Wfatal-errors.
1 голос
/ 24 февраля 2020

Вы можете проверить тип с помощью

static_assert(std::is_same_v<char, decl</*..many args..*/>>)

А для отладки вы можете использовать

template <typename> struct Debug; /* No definition */

Debug<decl</*..many args..*/>> d; // Error similar to: No definition for Debug<char>
...