在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的引用,这是我要求的功能可能有用的主要原因(因为模板用作模板参数)。
答案 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 b
和typename 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
。