将默认参数值设置为默认构造函数的更好语法

时间:2016-06-30 19:44:25

标签: c++ c++11 optional-parameters default-constructor

有人可能想要使用参数声明一个函数,并指定参数的默认值是类型的默认构造函数的结果:

void foo(a::really::long::type::name arg = a::really::long::type::name());

是否有更好的语法,不涉及两次输入类型名称?类似的东西:

void foo(a::really::long::type::name arg = default);

我意识到我可以typedef类型名称使其更漂亮,但我很好奇是否存在这样的语法。

1 个答案:

答案 0 :(得分:3)

如果您控制arg的班级,则可以采用行人方式。使用为enum重载的转换构造函数:

// Define this enum, and then write constructors which take dfl
enum dfl { dflval };

class a_really_long_type_name {
public:
  a_really_long_type_name(dfl arg = dflval);
};

现在foo可以是:

void foo(a_really_long_type_name arg = dflval);

如果你可以申请,可以获得便携性;这应该可以在一个有二十五年历史的C ++编译器中正常工作。

多个类都可以共享此dfl enum及其dflval - 风味零;这就像拥有一个新关键字一样。

因为enum是一个不同的类型,所以这不会干扰整数类型或字符的构造函数重载等等。

缺点是它已经进入了一些已经通过参数默认提供默认构造的类,这导致了重复的构造函数代码。