如何让模板模板参数采用数值

How to have a template template parameter take a numeric value?

本文关键字:参数      更新时间:2023-10-16

我想让模板参数接受具有数字模板参数的模板。

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

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(该类型特征对类型进行实际内省,而不是简单地返回int的东西)。

<小时 />

有人提议通过修改非类型模板参数的非推导上下文来改进此过程 (P0127)。

您的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