可以使用别名来更改函数的文字签名:
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/