我想让模板参数接受具有数字模板参数的模板.
这个例子可能过于简单了,但我喜欢这样的东西:
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>())
}
Run Code Online (Sandbox Code Playgroud)
我不能理解这个的语法,因为它必须是可能的.我怎么做到这一点?
只是稍微修改一下你的语法 - 因为模板模板参数设置不正确,我们最终会得到这样的结果:
template <typename T, template <T > class Z, T Value>
// ^^^^^^^^^^^^^^^^^^^^^
void foo(Z<Value> x) { }
Run Code Online (Sandbox Code Playgroud)
但是,编译器不能T在这里推断- 它是一个非推导的上下文.你必须明确提供它:
foo<int>(XX<1>{});
Run Code Online (Sandbox Code Playgroud)
这很烦人.我甚至不能写一个类型的特征,从而non_type_t<XX<1>>为int(其中该类型特质确实在实际类型反省,不是一件平凡的返回int).
有一项建议是通过修改非类型模板参数的非推断上下文来改进此过程(P0127).