我想让模板参数接受具有数字模板参数的模板.
这个例子可能过于简单了,但我喜欢这样的东西:
- 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>())
- }
我不能理解这个的语法,因为它必须是可能的.我怎么做到这一点?
解决方法
只是稍微修改一下你的语法 – 因为模板模板参数设置不正确,我们最终会得到这样的结果:
- 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(其中该类型trait对类型进行实际内省,而不是简单地返回int的东西).