Почему этот шаблон вывода не удается? - PullRequest
0 голосов
/ 11 апреля 2020

Я написал несколько шаблонных кодов для извлечения списка аргументов функций, чтобы выполнить строгое извлечение типов и проверку типов. Вот часть кода:

#include <type_traits>
#include <tuple>
#include <iostream>

template<typename>
struct function_traits {};

template <typename Return, typename... Args>
struct function_traits<Return (*)(Args...)>
{
    template<std::size_t N>
    using type = typename std::tuple_element<N, std::tuple<Args...>>::type;

    static constexpr size_t callback_param_cnt = sizeof...(Args);
};

template<typename T, std::size_t N = function_traits<T>::callback_param_cnt>
struct callback_info {};

template<typename T>
struct callback_info<T, 1> {
    constexpr static size_t val = function_traits<T>::callback_param_cnt;
};

template<typename T>
struct callback_info<T, 2> {
    constexpr static size_t val = function_traits<T>::callback_param_cnt;
};

void foo(int) {
}

int main() {
    function_traits<decltype(&foo)>::type<0> x;
    std::cout << callback_info<decltype(&foo)>::val;
}

Код компилируется без проблем. function_traits извлечение информации о функции, включая количество и тип аргументов. callback_info просто используя function_traits, чтобы извлечь некоторую информацию для функций с 1 и 2 аргументами. Как видите, этот код компилируется без проблем, и val в callback_info получает правильное количество аргументов (это тестовый код, чтобы убедиться, что я могу использовать function_traits внутри callback_info). Но вот моя проблема: хотя мой function_traits::type работает в main, я хочу использовать его в callback_info для сохранения типов аргументов. Примерно так:

template<typename T, std::size_t N = function_traits<T>::callback_param_cnt>
struct callback_info {};

template<typename T>
struct callback_info<T, 1> {
    using Type1 = typename function_traits<T>::type<0>;
    constexpr static size_t val = function_traits<T>::callback_param_cnt;
};

template<typename T>
struct callback_info<T, 2> {
    using Type1 = typename function_traits<T>::type<0>;
    using Type2 = typename function_traits<T>::type<1>;
    constexpr static size_t val = function_traits<T>::callback_param_cnt;
};

Но этот код не компилируется. Кажется, что из-за сбоя вывода шаблона он не может найти type здесь. Почему это происходит? Как я могу решить эту проблему? Кроме того, как я могу изменить function_traits, чтобы также определять ссылочные аргументы? потому что в настоящее время он определяет int& аргумент как int прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...