【问题标题】:What can you do with templates with zero template parameters?你可以用零模板参数的模板做什么?
【发布时间】:2015-09-13 07:29:56
【问题描述】:

我前段时间了解到,您可以创建零参数的模板。虽然无法直接创建它们,但您可以使用成员模板

template<typename ...T> 
struct Maker {
   template<T...>
   struct HasNParams { };
};

Maker<>::HasNParams<> hnp;

我想知道这是否是为了形成良好的格式以及您可以对这些野兽做什么。您可以将它们作为模板参数传递,并创建明确的特化(我猜唯一的场景是针对空的情况)?

【问题讨论】:

  • 问题只是“你能用SomeClassTemplate&lt;&gt;做什么?”这让我觉得很宽泛。
  • 通用?你可以用空的vector 做什么?
  • @Barry 你无法在 C++11 之前创建它们,而且我还没有看到应用程序,也没有关于它们的文章。这让我想知道它们是否是您不应该在代码中使用的意外?或者有什么用途,它们是什么?
  • @Barry 如果您有很多用例并且可以演示它们,请继续,因为这表明该功能不是“意外”,至少不会很快消失。我会在你的答案上打分=)
  • 我并不是说空模板是 C++11 的明确设计目标,而是说它们作为新的可变参数设计的一部分出现了,而且要明确禁止这些,没有明显的好处。

标签: c++ templates c++11


【解决方案1】:

冒着听起来很明显的风险,结束递归实例化。

template<typename Arg, typename ...T> 
struct Maker : public Maker<T...>
{
   template<T...>
   struct HasNmin1Params { };
};

这里的重点是Maker 的实际参数列表不是空的,但我们只在HasNminOneParams 中使用了N-1 个参数。

【讨论】:

  • 谢谢,可以举个例子吗?我还没有看到这个。
【解决方案2】:

考虑以下类模板:

template <typename... > struct typelist { };

这是容器的元编程等价物。同样,空的vectormap 很有用,空的typelist 也很有用。也就是说,typelist&lt;&gt; 类型的东西。以下是此类构造的两个示例用例。

可能是类型递归的终止条件:

void foo(typelist<> ) { }

template <typename T, typename... Ts>
void foo(typelist<T, Ts...> ) {
    bar<T>();
    foo(typelist<Ts...>{});
}

它可能是元函数的“返回”值,表示失败情况。

template <typename F, typename T>
struct filter_one
: std::conditional_t<F::template apply<T>::value,
                     typelist<T>, 
                     typelist<>>
{ };

这是我们可以用来编写类型列表过滤器元函数的助手:

template <typename F, typename TL>
struct filter;

template <typename F, typename... Ts>
struct filter<F, typelist<Ts...>>
: concat_t<filter_one<F, Ts>...>
{ };

这两个都是typelist&lt;&gt; 的非常有用的功能,而这只是一个类模板。

【讨论】:

  • 嗯,但是您所拥有的是一个带有空参数包的模板实例化。在我的示例中,我们有一个没有参数包的模板,只是零参数,就像在template&lt;&gt; struct Foo { } 中一样,是由语义而不是语法创建的(因为语法是为显式特化而保留的)。我看不出如何将您的示例转移到我的案例中。
  • @JohannesSchaub-litb 您的示例中有两个参数包。 T 是一组类型,也是一组未命名的 Ts。它仍然是空的参数包实例化。您是在专门询问无类型的空值包吗?
  • 为什么第二个是Ts 的未命名包?这对我来说毫无意义,请您进一步解释一下吗?对我来说,这只是将T 扩展为参数列表,在我的情况下会导致 0 个参数。
  • @JohannesSchaub-litb 好吧,您只是没有命名它吗?基本上是template &lt;T... Vals&gt; struct HasNParams { }; 你只有一个空的Vals
  • @JohannesSchaub-litb 我还是不知道你在问什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2011-10-01
  • 1970-01-01
  • 2014-09-08
  • 2014-04-12
  • 1970-01-01
  • 2019-11-22
相关资源
最近更新 更多