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允许在赋值中进行隐式转换。