c++ - 使用别名严格输入函数参数

标签 c++ c++11 overloading alias typedef

可以使用别名来更改函数的文字签名:

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"});

我目前的解决方案是定义简单的包装器类,其中包含我想要作为成员别名的类型。这并不理想,因为它需要将成员类的接口(interface)复制到包装器中,这在使用别名时是不必要的。

最佳答案

您采取的方法是正确的。包装原始类型的对象是您目前所能做的最好的事情。

我最近在 CppCon 2015 上谈到了这个话题,并开源了一个库,可以方便地为整数类型制作“不透明的 typedef”: https://sourceforge.net/projects/opaque-typedef/

请注意,自定义新类型的界面、删除对您的目的而言可能出错的操作以及添加与其他类型的有意互操作性可能是有益的。 Slides from my presentation .

关于c++ - 使用别名严格输入函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32938686/

相关文章:

java - 使用基类引用的派生类对象重载方法 - java

java - Java 8 重载可以区分函数参数参数类型吗?

c++ - 使用可变参数访问无参数模板函数的不明确重载

c++ - OpenCV 人脸检测功能仅在第二次调用时有效

c++ - 使用按位运算符编写一个程序来确定正余数

c++ - 为什么函数声明在 C++ 中可以有 const 参数?

c++ - 为什么 std::get 没有接受转发引用的单一签名

C++ Vector Sort 方法编译失败,返回预期的表达式

c++ - 在编译时将文本文件导入到 std::string

C++ : compile time assert the value of a floating point number