指定可选模板参数的子集
Specifying a subset of optional template parameters
>假设我有一个模板类,比如
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 命名模板参数。源代码可用。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 可变参数子集
- 模板函数,具有元组类型子集的相应参数
- EXPECT_CALL检查参数是否包含给定的子集
- 根据给定的索引集获取参数包的子集
- 指定可选模板参数的子集