为什么你不能模板模板?

时间:2015-09-08 10:48:11

标签: c++ templates

在C ++中有2种模板类型(据我所知):模板类和模板函数。为什么不可能有模板模板? (无论是类,功能还是其他模板)。是否曾在标准中考虑过?它是否以某种方式破坏了C ++语法/精神? 我知道这可能听起来很疯狂,并且很容易绕过。

C ++有什么可能:

template<bool b>
class TemplateDependingOnBool
{
public:
  template<typename T>
  class TheTemplateWeWant{};
}

什么会很棒:

template<bool b>
template<typename T>
class TheTemplateWeWant{};

并以基于策略的方式调用它(这是非常有趣的地方):

template<typename T, template<typename> class ThePolicy = TheTemplateWeWant<true> >
class Foo {};

现在可行的方法是使用:

template<typename T,
  template<typename> class ThePolicy = TemplateDependingOnBool<true>::TheTemplateWeWant >
class Foo{};

这不是很优雅。

修改
我知道我可以模板化2个参数。目标是将底层模板类(模板化模板)单独使用,无论是模板别名还是模板模板参数(如我的示例所示)。 基于策略的设计是对Andrei Alexandrescu的Modern C++ Design的引用,这是我要求的功能可能有用的主要原因(因为模板用作模板参数)。

4 个答案:

答案 0 :(得分:6)

使用C ++ 11,您只假设两种类型的模板是错误的。还有type aliases允许

data.results.collection1.forEach(function(el) {
   delete el.url
   delete el.name.href
});

答案 1 :(得分:4)

如果我了解您正确询问的内容(而且我的问题并不完全清楚),那么您可以使用以下两个参数编写模板:

template <bool b, typename T>
class TheTemplateWeWant { ... };

添加元函数以部分应用bool

template <bool b>
struct PartiallyWant {
    template <typename T>
    using type = TheTemplateWeWant<b, T>;
};

然后将其作为您的政策传递:

template<typename T,
         template<typename> class ThePolicy = PartiallyWant<true>::type >
class Foo { ... };

Foo<char, PartiallyWant<false>::type> foo;

那么为什么不像你建议的那样分层模板呢?简单的答案是,没有理由。如果TheTemplateWeWant有两个模板参数(bool btypename T,无论它是否是&#34;内部&#34;类,那么我们应该表达它因此。如果我们只想应用一种类型或另一种类型,那么用户案例比一般模板少,而且只需几行样板就可以解决这个问题。另外,如果我们有这样的功能,现在我想部分应用T而不是b怎么办?有了几行样板,我可以再次完成相同的事情,但是通过分层,这是不可能的。

答案 2 :(得分:0)

据我所知,你只是这样,它可以按照你想要的方式工作 - 用2个参数模板化。

template<bool b, typename T>
class TheTemplateWeWant{}; //valid in C++

答案 3 :(得分:0)

您所描述的是模板参数的部分绑定,就像std::bind可以将二进制函数转换为一元函数一样。

对于元编程的疯狂,有Boost.MPL。他们有一个模板boost::mpl::bind