首页 > 解决方案 > 为什么这个模板扣除失败?

问题描述

我编写了一些基于模板的代码来提取函数参数列表,以便执行一些严格的类型提取和类型检查。以下是部分代码:

#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

标签: c++templates

解决方案


推荐阅读