考虑一个假设的元函数arity,它将任何元函数作为参数并返回其实际的元素.
以下明显的方法是不可能的,因为名为内部模板模板参数的语言标准仅在本地定义.
template<template<typename... args> class f>
struct arity
{
static constexpr std::size_t value = sizeof...(args); //ERROR: undefined 'args'
};
Run Code Online (Sandbox Code Playgroud)
甚至没有详尽的专门化是另一种选择,因为采用另一种模板类型的模板类型在内部模板的参数数量方面可能不是部分专用的.
这让我想到了一个问题,我担心其答案是否定的.
有没有合理的方法来反省模板类型的实际特征?
我不希望实际实现arity采用模板类型的形式,例如在显而易见的方法中,也就是说,在编译期间可以计算的任何东西都可以作为"合理"的解决方案,只要它不是不依赖于实际的论点.
注意:为简单起见,假设只允许非变量元函数作为参数arity.
假设有人需要对模板类型进行部分专业化处理,而该模板类型的所有参数都是的专门化,则该模板类型需要可变的类型列表std::integral_constant。
以下简单方法已被各种版本的clang和GCC接受,但由于错误而被VS 14(2015)拒绝:
错误C3522:“ t”:在这种情况下无法扩展参数包
template<typename...>
struct foo;
template<typename... t, t... v>
struct foo<std::integral_constant<t, v>...>
{
/* ... */
};
foo<std::integral_constant<int, -1>, std::true_type> bar;
Run Code Online (Sandbox Code Playgroud)
我似乎在C ++标准草案(n4296)中找不到可以允许或不允许这种类型的模式匹配的任何内容,因此在我提交针对VS 14的错误报告之前,最好参考那里的专家:
上面的示例真的有效的C ++吗?