【发布时间】:2015-10-04 21:38:30
【问题描述】:
可以使用别名来更改函数的文字签名:
using String = std::string;
void Print(String s) { ... };
但这并不允许使用std::string 调用Print:
Print(std::string{"Hello world"}); // Still works
这是有道理的——别名严格来说是为了简化类型的名称,它没有定义新的类型。
除了子类化,即not a good idea,是否有一种机制可以实现函数参数的名称严格类型化?这样做的直接后果是这也是可能的:
using StringA = std::string;
using StringB = std::string;
void Print(StringA s) { ... };
void Print(StringB s) { ... };
Print(StringA{"Hello world"});
Print(StringB{"Hi everyone"});
我当前的解决方案是定义简单的包装类,这些类包含我想要别名为成员的类型。这并不理想,因为它需要将成员类的接口复制到包装器中,这在使用别名时不是必需的。
【问题讨论】:
-
请注意,第二个答案表明如果您小心的话,在您的情况下创建派生类可能是合理的:stackoverflow.com/a/6014514/951890
-
这是一个很好的分析。感谢您指出这一点,我经常忽略未选择的答案,但这是一个令人谦卑的阅读。
标签: c++ c++11 overloading alias typedef