指定可选模板参数的子集

时间:2014-04-07 21:15:29

标签: c++ templates

假设我有一个类似

的模板类
template<class FooPolicy=DefaultFooPolicy, 
  class BarPolicy=DefaultBarPolicy, 
  class BazPolicy=DefaultBazPolicy> HighlyCustomizableClass;

现在我声明一些typedef:

typedef HighlyCustomizableClass<AlternativeFooPolicy> VersionA;
typedef HighlyCustomizableClass<DefaultFooPolicy,AlternativeBarPolicy> VersionB;
typedef HighlyCustomizableClass<DefaultFooPolicy,DefaultBarPolicy,AlternativeBazPolicy> VersionC;

这可能会变得笨拙,特别是如果我们有更多的模板参数。此外,如果向Policy添加了另一个HighlyCustomizableClass类型,则现有的typedef语句将变为无效。这似乎没必要。

能够将它们写成以下内容要好得多:

typedef HighlyCustomizableClass<FooPolicy=AlternativeFooPolicy> VersionA;
typedef HighlyCustomizableClass<BarPolicy=AlternativeBarPolicy> VersionB;
typedef HighlyCustomizableClass<BazPolicy=AlternativeBazPolicy> VersionC;

理论上c ++是否可以允许这种语法?如果是这样,是否有任何未来标准的采纳计划?如果没有,是否有某种原因导致这种语法出现问题?

2 个答案:

答案 0 :(得分:2)

您不喜欢它,但是在C ++ 11中使用模板别名可以说

template<
   class foo=def_foo, 
   class bar=def_bar, 
   class baz=def_baz
> custom;

template<class foo=alt_foo>
using VersionA = custom<foo>;

template<class bar=alt_bar>
using VersionB = custom<def_foo, bar>;

template<class baz=alt_baz>
using VersionC = custom<def_foo, def_bar, baz>;

我冒昧地缩短名字: - )

模板参数由它们在参数列表中的位置(就像函数参数一样)而不是它们的名称(例如HTML元素的属性)来标识!。

答案 1 :(得分:1)

C ++中支持的语法是

typedef HighlyCustomizableClass<FooPolicy<AlternativeFooPolicy>> VersionA;

这个成语被称为命名模板参数,可以在Boost Parameter Library的帮助下实现。如果您不喜欢提升,可以查看C++ Templates The Complete Guide 16.1命名模板参数。 Source code可用。