C+中的typesafe typedef+; 我想在我的C++程序中使用一些类似TyWIFF的东西来提高类型安全性。
例如,假设我有两个函数C+中的typesafe typedef+; 我想在我的C++程序中使用一些类似TyWIFF的东西来提高类型安全性。,c++,types,type-safety,C++,Types,Type Safety,例如,假设我有两个函数 void function1(unsigned idOfType1); void function2(unsigned idOfType2); 然后我会错误地将idOfType2传递给function1,反之亦然。我希望编译器在这种情况下给我一个错误。我知道我可以将这些未签名的数据打包到一个结构中,但是我必须提供一个字段名并使用来访问它们,这有点不方便。有什么好办法吗 编辑:据我所知,typedef不能用于此目的,因为它只是一种类型的简写,不会用于类型检查。使用: ty
void function1(unsigned idOfType1);
void function2(unsigned idOfType2);
然后我会错误地将idOfType2传递给function1,反之亦然。我希望编译器在这种情况下给我一个错误。我知道我可以将这些未签名的数据打包到一个结构中,但是我必须提供一个字段名并使用
来访问它们,这有点不方便。有什么好办法吗
编辑:据我所知,typedef
不能用于此目的,因为它只是一种类型的简写,不会用于类型检查。使用:
typedef
为现有类型创建别名。它不会创建可用于匹配函数或模板参数的新类型
BOOST_STRONG_TYPEDEF的使用解决了这个问题
BOOST\u STRONG\u TYPEDEF
是一个宏,它生成一个名为“name”的类包装及其基元类型的实例,并提供适当的转换运算符,以使新类型可替换其包装的类型
正如你所说,typedef在这里帮不了你。我现在想不出更好的方法了,但是如果你在一个struct/class选项中进行包装,你可以使用一个转换操作符来消除成员方法或函数调用 例如:
struct WrappedType
{
operator type()
{
return _value;
}
type _value;
}
我不是说这是一种方法,请注意;-) 有一个名为
enum class
的c++11特性,它基本上是一个类型安全的enum。也许他们可以在这里提供帮助。您可以检查函数中的类型,以便如果不匹配,可以打印错误或其他内容
您可以使用typeid检测变量类型,如下所示:
typeid(*variablename*).name()
正如其中一个答案中所建议的,这取决于编译器,您必须使用try-and-error方法来确定哪个值适合您。这是对一个旧问题的延迟回答。但是C++前端有了新的发展,为了完整性,我补充了这个答案: opaque_typedef库是作者试图通过库提供opaque typedef的大部分价值,而不必等待opaque typedef成为语言功能 这个图书馆的作者Kyle Markley对这个图书馆做了介绍。他的演讲幻灯片在图书馆的源代码上,可在上找到。该库仅为头文件,用C++11编写。Gcc和clang还可以,但VS2015似乎有问题 图书馆的使用是直截了当的。以下代码取自文档。它创建一个不透明的int类型定义。它与int具有相同的接口(可以添加、移位、递增、比较等),但参数和返回值是新创建的类型,而不是int类型:
#include "opaque/numeric_typedef.hpp"
struct myint : opaque::numeric_typedef<int, myint> {
using base = opaque::numeric_typedef<int, myint>;
using base::base;
};
#包括“不透明/数字_typedef.hpp”
结构myint:opaque::numeric_typedef{
使用base=opaque::numeric_typedef;
使用base::base;
};
介绍了各种方法,从简单案例的示例类开始:
class meter
{
public:
explicit meter(int val)
: value_(val) {}
explicit operator int() const noexcept
{
return value_;
}
private:
int value_;
};
最后是一个简短的模板库,支持自定义类型安全类型的算术运算,允许编写以下代码:
struct meter
: strong_typedef<meter, int>, addition<meter>
{
using strong_typedef::strong_typedef;
};
struct-meter
:strong_typedef,加法
{
使用strong_typedef::strong_typedef;
};
enum在您的情况下运行良好…@AlexanderPavlov想详细说明一下,这对我来说并不明显…@Paul:您可以编写类似于enum Type1的代码{dummy0=1,dummy1=1@SteveJessop:对,我的意思是一种类似的方法,但不是两个值的幂-Paul不会按位或它们,是吗?@SteveJessop我明白了,谢谢你的解释。不过这感觉有点粗糙。从和两个整数的转换如何工作?enum
s总是类型安全的,例如enum x{a};枚举y{b};y=a;
不会编译。-@phresnel我认为这是正确的一半,因为枚举将被隐式转换为int,不是吗?@Paul:让我们同意0.75*true,因为相反的是不正确的。所以,似乎枚举是75%类型安全的,@phresnel好吧,我一直不喜欢布尔是二进制的!你能告诉我如何使用类型吗运算符?Boost strong typedef通常看起来是一个不错的选择,但在我的情况下可能不起作用,所以我对这个解决方案感兴趣!@Konrad很棒!感谢您的详细说明。如果我不能使用Boost strong typedef,那么我将使用这个解决方案。@Konrad我喜欢这个答案,因为它让我深入了解了我以前不知道的类型运算符,所以我是要接受你。这是C++中的一个有趣的事情,你通常不会遇到:-保罗:在你的代码中,它将是代码>操作符unsiNeDeD()/<代码>。
不起作用:但我必须在每个函数调用中都这样做+它依赖于编译器?抱歉,我认为这不是一个好选择…无论如何都不起作用-function1
中的参数idOfType1
的类型始终是未签名的。调用方传递的内容已被转换。注意:that Boost strong typedef允许在赋值中进行隐式转换。