c – 明确地使用类模板实例化中的一些参数的默认值

类模板可以有多个参数都具有默认值。

template<typename UnderlyingT0 = int, typename UnderlyingtT1 = long, typename StringT = std::string>
struct options;

使用默认参数实现模板很简单:

options<> my_default_options;

但是如果我想改变一个参数子集怎么办?

options<int, int, std::wstring> wstring_options;

int不是第一个参数的默认值,而第二个参数不是默认值。有什么东西吗

options<default, int, std::wstring> wstring_options;

在C?

不,标准C中没有什么可以实现的。 @FlorisVelleman在评论中指出的一个选择是引入一个别名模板:

template <class UnderlyingT1, class StringT = std::string>
using options_defT0 = options<int, UnderlyingT1, StringT>;

这具有在别名定义中明确复制UnderlyingT0的默认参数的缺点,但至少它只在一个地方重复。

许多Boost库使用了一个替代选项。他们引入一个特殊标签use_default并将其设为默认值。这样的东西:

struct use_default {};

template<typename UnderlyingT0 = use_default, typename UnderlyingtT1 = use_default, typename StringT = use_default>
struct options
{
  using RealUnderlyingT0 = typename std::conditional<
    std::is_same<UnderlyingT0, use_default>::value,
    int,
    UnderlyingT0
  >::type;

  using RealUnderlyingT1 = typename std::conditional<
    std::is_same<UnderlyingT1, use_default>::value,
    long,
    UnderlyingT1
  >::type;

  using RealStringT = typename std::conditional<
    std::is_same<StringT, use_default>::value,
    std::string,
    StringT
  >::type;
};

这里的缺点是:1.您不能通过查看模板声明来告诉默认参数,而选项<>并且选项< int,long,std :: string>是不同的类型。

前者可以通过良好的文档来修复,后者可能通过明智地使用转换函数和基类来帮助。

http://stackoverflow.com/questions/29694299/explicitly-use-defaults-for-some-parameters-in-class-template-instantiation

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 明确地使用类模板实例化中的一些参数的默认值