指定可选模板参数的子集

Specifying a subset of optional template parameters

本文关键字:参数 子集      更新时间:2023-10-16

>假设我有一个模板类,比如

template<class FooPolicy=DefaultFooPolicy, 
  class BarPolicy=DefaultBarPolicy, 
  class BazPolicy=DefaultBazPolicy> HighlyCustomizableClass;

现在我声明一些类型定义:

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++ 是否可能允许这种语法?如果是这样,是否有任何计划让未来的标准采用它?如果不是,是否有某种原因导致这种语法有问题?

这不是

您想要的,但是您可以使用 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 元素的属性)来标识!

C++ 中支持的语法是

typedef HighlyCustomizableClass<FooPolicy<AlternativeFooPolicy>> VersionA;

该习语称为命名模板参数,可以在 Boost 参数库的帮助下实现。如果您不喜欢 boost,可以查看C++模板完整指南 16.1 命名模板参数。源代码可用。