为什么可以';你不做模板吗? C++中有2种模板类型(模板)和模板函数。为什么不可能有一个模板的模板?(可以是类、函数或其他模板)。标准中是否考虑过这一点?它是否以某种方式破坏C++语法/精神? 我知道这听起来很疯狂,而且很容易四处走动

为什么可以';你不做模板吗? C++中有2种模板类型(模板)和模板函数。为什么不可能有一个模板的模板?(可以是类、函数或其他模板)。标准中是否考虑过这一点?它是否以某种方式破坏C++语法/精神? 我知道这听起来很疯狂,而且很容易四处走动,c++,templates,C++,Templates,使用C++可以做什么: template<bool b> class TemplateDependingOnBool { public: template<typename T> class TheTemplateWeWant{}; } 模板 类TemplateDependingOnBool { 公众: 模板 将模板分类为Wewant{}; } 什么是最好的: template<bool b> template<typename T>

使用C++可以做什么:

template<bool b>
class TemplateDependingOnBool
{
public:
  template<typename T>
  class TheTemplateWeWant{};
}
模板
类TemplateDependingOnBool
{
公众:
模板
将模板分类为Wewant{};
}
什么是最好的:

template<bool b>
template<typename T>
class TheTemplateWeWant{};
模板
模板
将模板分类为Wewant{};
并以基于策略的方式进行命名(这才是真正有趣的地方):

模板
类Foo{};
现在可以使用的方法是:

template<typename T,
  template<typename> class ThePolicy = TemplateDependingOnBool<true>::TheTemplateWeWant >
class Foo{};
模板
类Foo{};
这不是很优雅

编辑:
我知道我可以在两个参数上设置模板。目标是将基础模板类(模板化模板)本身用作某种东西,可以是模板别名或模板模板参数(如我的示例所示)。
基于策略的设计是对Andrei Alexandrescu的参考,这也是我所问的功能可能有用的主要原因(因为模板用作模板参数)。

据我所知,您可以简单地做到这一点,它可以按照您的需要工作-使用2个参数模板化类

template<bool b, typename T>
class TheTemplateWeWant{}; //valid in C++
模板
将模板分类为Wewant{}//在C++中有效

如果我正确理解了您的问题(我对您的问题不完全清楚),那么您可以使用两个参数编写模板:

template <bool b, typename T>
class TheTemplateWeWant { ... };
然后将其作为您的策略传递:

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

Foo<char, PartiallyWant<false>::type> foo;
模板
类Foo{…};
富富,;


那么为什么不像你建议的那样对模板进行分层呢?简单的答案是没有理由这么做。如果
我们想要的模板
有两个模板参数(
bool b
typename T
,不管它是否是“内部”类),那么我们应该将其表示为这样。如果我们只想应用一种类型或另一种类型,那么它的用例比一般模板少,同时也可以用几行样板文件来解决。另外,如果我们有这样一个特性,现在我想部分应用
T
,而不是
b
?有了几行样板,我可以再次完成同样的事情,但有了分层,这是不可能的

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


对于元编程的疯狂,有Boost.MPL。在C++11中,它们确实有一个模板
boost::mpl::bind

,您错误地认为只有两种类型的模板。还存在允许

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

template<typename T>
using ThePolicy = TheTemplateWeWant<true, T>
模板
类化我们想要的模板{…};
模板
使用策略=我们想要的模板

您应该编写
模板类TheTemplateWeWant{}当你提到“基于策略的样式”时,我想到了。我不明白你到底在问什么。我真的看不出多个模板参数的优势。你能给出一个你想要解决的具体用例吗?我现在不明白为什么这是严格需要的。OP可能梦想着在模板上进行咖喱化,或者部分评估。他应该研究一下Common Lisp(它的元编程能力比C++11好得多),即使它以问号结尾,也可能不是OP真正的问题。它更像是一个修辞问题。@erip这是一个答案,但我不确定100%这是否是他想要的。这就是为什么我在最后问他,如果他回答不,那么我会更改/删除它。OP提供了一个用例。这个答案不能解决OP的用例。您能否演示如何使用您的语法将一个参数绑定到模板,而不绑定另一个参数?如果您可以在不必包装非类型参数的情况下进行一般性操作,则会获得额外的好处。我认为您不应该包装它,您可以简单地使用模板。@Melkon您将如何使用模板?它需要两个模板参数,我们需要将它传递给需要一个模板参数的东西。嗯,你是对的,这个抽象可能是必需的(谢谢,可能是我要找的最接近的答案。它仍然需要另一个声明(我的问题是关于语言,以及如果,如果不是,为什么可以想象和实施几个层次的模板深度)。@ Raymond Chen:关于Windows特性(但同样适用于C++特性):“所有的建议都是在-100开始的,必须有一个很好的理由来添加一些东西”。这回答了你的问题“为什么不?”:因为语言已经足够复杂了。注意C++得到了这第三种模板,因为它是一个相当简单的机制,它可以让许多复杂的结构过时(参见我的其他C++ 98答案,Boo.MPL)。.这可能是我要找的答案中最重要的部分。我的理由当然不是要在语言中引入如此复杂的东西。
template<typename T,
         template<typename> class ThePolicy = PartiallyWant<true>::type >
class Foo { ... };

Foo<char, PartiallyWant<false>::type> foo;
template <bool b, typename T>
class TheTemplateWeWant { ... };

template<typename T>
using ThePolicy = TheTemplateWeWant<true, T>