【发布时间】:2020-09-01 15:25:11
【问题描述】:
假设我有一个带有一些默认模板参数的类模板cls1 和另一个使用cls1 的类模板cls2:
template<typename T1, typename T2 = int, typename U = std::vector<T1>>
class cls1 {};
template<typename T1, typename T2 = int, typename U = std::vector<T1>>
class cls2 : public cls1<T1, T2, U> {};
现在,如果我想更改 cls1 的某些模板参数的默认值,我还需要手动在 cls2 中更改它以保持一致性。
我已经考虑过使用类型别名(或在非类型模板参数的情况下使用constexpr 变量):
using cls1_default_t_2 = int;
template<typename T1>
using cls1_default_u = std::vector<T1>;
template<typename T1, typename T2 = cls1_default_t_2, typename U = cls1_default_u_t<T1>>
class cls1 {};
template<typename T1, typename T2 = cls1_default_t_2, typename U = cls1_default_u_t<T1>>
class cls2 : public cls1<T1, T2, U> {};
现在我只需要更改cls1_default_t_2 或cls1_default_u。
但是,这有点冗长,具体取决于默认参数的数量。此外,如果我现在想使另一个类模板cls3 使用cls2,则不宜使用cls1 的默认参数,因为cls1 实际上并没有被cls3 直接使用。相反,我需要再次为cls2 的默认模板参数提供类型别名(和constexprs),以便在cls3 中使用它们:
// ... cls1 as seen above
using cls2_default_t_2 = cls1_default_t_2;
template<typename T1>
using cls2_default_u_t = cls1_default_u_t<T1>;
template<typename T1, typename T2 = cls2_default_t_2, typename U = cls2_default_u_t<T1>>
class cls2 : public cls1<T1, T2, U> {};
template<typename T1, typename T2 = cls2_default_t_2, typename U = cls2_default_u_t<T1>>
class cls3 : public cls2<T1, T2, U> {};
那么,有没有更简洁的表示法在另一个模板声明中使用默认模板参数?
【问题讨论】:
-
你需要很多默认类型吗?你不能只做
using default_type = int; using default_container = std::vector<int>;并使用它吗? -
@idclev463035818 因为那时,如果我有
cls3使用default_type并更改cls2的默认参数,cls3不会反映此显式更改。我想像template<typename T1, typename T2 = [default of cls2's T2], typename U = [default of cls2's U]>为cls3(分别为cls2)。
标签: c++ templates default-arguments