我希望模板参数接受具有数字模板参数的模板。
这个例子可能过于简化,但我想要这样的事情:
template <int X>
struct XX
{
static const int x = X;
};
template<typename TT, TT V, template<V> TX>
void fnx(TX<V> x)
{
static_assert(V == TX::x, "IMPOSSIBLE!");
}
void fny()
{
fnx(XX<1>())
}
我一定不能理解这个的语法,因为它必须是可能的。我该如何做到这一点?
答案 0 :(得分:6)
稍微修改一下你的语法 - 由于模板模板参数设置不正确,我们最终得到的结论是:
template <typename T, template <T > class Z, T Value>
// ^^^^^^^^^^^^^^^^^^^^^
void foo(Z<Value> x) { }
但是,编译器不能在此推断T
- 它是一个非推断的上下文。您必须明确提供它:
foo<int>(XX<1>{});
这太烦人了。我甚至不能编写一个类型特征,non_type_t<XX<1>>
是int
(其中该类型特征对类型进行实际内省,而不是简单地返回int
)。
有人建议通过修改非类型模板参数的非推断上下文来改进此过程(P0127)。
答案 1 :(得分:2)
您对fnx
的声明需要一些工作,TT
类型无法在呼叫网站上推断出来。
template<typename TT, TT V, template<TT> class TX>
void fnx(TX<V> x)
{
static_assert(V == TX<V>::x, "IMPOSSIBLE!");
}
void fny()
{
fnx<int>(XX<1>());
}