如何使模板模板参数取数值?

时间:2016-05-22 15:57:10

标签: c++ templates

我希望模板参数接受具有数字模板参数的模板。

这个例子可能过于简化,但我想要这样的事情:

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>())
}

我一定不能理解这个的语法,因为它必须是可能的。我该如何做到这一点?

2 个答案:

答案 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>());
}

工作示例:https://ideone.com/57PsCA