c++ - 为什么这个模板扣除失败?
问题描述
我编写了一些基于模板的代码来提取函数参数列表,以便执行一些严格的类型提取和类型检查。以下是部分代码:
#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# - 异步等待与简单执行
- c++ - std::map< K, std::vector
> 分配 - android - 自 Oreo/API 26 起允许用户设置通知灯颜色
- javascript - 我正在创建一个系统,我的控制台说我的一个功能是未定义的
- macos - 如何在没有 ViewController 的情况下初始化内置于 Interface Builder(由 Xib 支持)的可重用 NSView
- sql - 处理运行总计中的空值
- ios - Xcode 分析仪器调用树无法识别我的源代码
- python - AttributeError:模块“vpython”没有属性“Modellearning”
- c# - 将对象动态转换回原来的样子
- javascript - javaScript(s) 是否会相互覆盖?