C ++模板:覆盖一些但不是全部的默认参数?

时间:2015-08-05 19:15:03

标签: c++ templates default-arguments

当我遇到一个带有几个默认参数的模板时,例如

template<typename ID = int, typename PAYLOAD = std::string>
class Foo{};

我有办法覆盖一些默认参数,而不是全部吗?

即。而不是编写以下内容来创建一个对std::string参数使用整数而不是PAYLOAD的类,

typedef Foo<int,int> Bar;

我可以写一些类似的东西:

typedef Foo<PAYLOAD=int> Bar;

我正在处理另一个团队的预定义模板,其中包含许多默认参数,并且能够使用第二种方法似乎可以提高我的代码的清晰度。

查看StackOverflow上的文档和其他问题,它似乎不可能,但我想知道是否有人可以解释为什么这不是一个功能?

3 个答案:

答案 0 :(得分:2)

没有

不支持模板类型。可以按从左到右的顺序指定类型来代替默认值。

答案 1 :(得分:2)

在C ++的设计和演变中,Bjarne Stroustrup提到有关于关键字参数的提议;然而,他们被拒绝,因为

  

扩展组达成共识,认为该提案接近冗余,会导致与现有C ++代码的兼容性问题,并会鼓励不应该鼓励的编程风格。

我认为出于同样的原因,未包含关键字模板参数。如果你想简化你的生活,要么typedef要么复杂,要么编写重新排序模板参数的适配器类。

答案 2 :(得分:0)

如果模板除了类型之外什么都没有伪造,你可以用索引替换。

创建绑定了前n个args的模板。然后提取参数并替换你想要的参数。

这要求前n个参数在没有位置参数的情况下有效。

草图:

 template<class...>struct types{using type=types;};
 template<class types, class T, size_t index>
 struct replace{
   using type=/*types with index replaced with `T`*/;
 };
 template<template<class...>class Z,class types>
 struct apply;// applies content of types to Z
 template<size_t n, class T>struct rep{};
 template<class Z, class...reps>
 struct replacing;
 template<template<class...>class Z, class...Ts,class...reps>
 struct replacing<Z<Ts...>,reps...>:
   apply<Z,replacing_t<types<Ts...>,reps...>>
 {};
 template<class...Ts,class T0,class n,class...reps>
 struct replacing<types<Ts...>,rep<n,T0>,reps...>:
   replacing<replace_t<types<Ts...>,T0,n>,reps...>
 {};
 template<class...Ts>
 struct replacing<types<Ts...>>:
   types<Ts...>
 {};

_t使用别名和一些操作留空。

然后你可以:

 replacing_t<some_template<>,rep<1,int>>

使用some_template的默认参数,但将arg1替换为int