当我遇到一个带有几个默认参数的模板时,例如
template<typename ID = int, typename PAYLOAD = std::string>
class Foo{};
我有办法覆盖一些默认参数,而不是全部吗?
即。而不是编写以下内容来创建一个对std::string
参数使用整数而不是PAYLOAD
的类,
typedef Foo<int,int> Bar;
我可以写一些类似的东西:
typedef Foo<PAYLOAD=int> Bar;
我正在处理另一个团队的预定义模板,其中包含许多默认参数,并且能够使用第二种方法似乎可以提高我的代码的清晰度。
查看StackOverflow上的文档和其他问题,它似乎不可能,但我想知道是否有人可以解释为什么这不是一个功能?
答案 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
。