假设我有一个类似
的模板类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 ++是否可以允许这种语法?如果是这样,是否有任何未来标准的采纳计划?如果没有,是否有某种原因导致这种语法出现问题?
答案 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可用。