Я написал несколько шаблонных кодов для извлечения списка аргументов функций, чтобы выполнить строгое извлечение типов и проверку типов. Вот часть кода:
#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
прямо сейчас.