typesafe typedef in C++

typesafe typedef in C++

本文关键字:C++ in typedef typesafe      更新时间:2023-10-16

我想在C++程序中使用类似typedef的东西来增强类型安全性。

举个例子,假设我有两个函数

void function1(unsigned idOfType1);
void function2(unsigned idOfType2);

那么我可以错误地将idOfType2传递给function1,反之亦然。在这种情况下,我希望编译器给我一个错误。我知道我可以将这些未签名的内容封装在一个结构中,但之后我必须提供一个字段名并使用.来访问它们,这有点不方便。有什么好办法解决这个问题吗?

编辑:据我所知,typedef不适用于此目的,因为它只是类型的简写,不会用于类型检查。

使用Boost强typedef:

typedef为现有类型创建一个别名。它不会创建可用于匹配函数或模板参数的新类型。。。

BOOstrongTRONG_TYPEDEF的使用解决了以下问题。。。

BOOST_STRONG_TYPEDEF是一个宏,它生成一个名为"name"的类包装及其基元类型的实例,并提供适当的转换运算符,以使新类型可以替换它包装的类型。

正如您所说,typedef在这里对您没有帮助。我想不出更好的方法了,但是,如果你在结构/类选项中进行包装,你可以使用转换运算符来消除成员方法或函数调用。

例如:

struct WrappedType
{
    operator type()
    {
         return _value;
    }
    type _value;  
}

我并不是说这是的方式,请注意;-)

这是对一个老问题的迟回复。但是在C++方面有了新的发展,为了完整起见,我添加了这个答案:

opaque_typedef库是作者试图通过库提供不透明typedef的大部分值,而无需等待不透明typedefs成为一种语言功能。

该图书馆的作者Kyle Markley在2015年的cppcon上发表了简短而精彩的演讲,介绍了该图书馆。他的演讲幻灯片在github上,图书馆的源代码在sourceforge上。该库仅为头文件,使用C++11编写。Gcc和clang还可以,但VS2015似乎有问题。

图书馆的使用是直接的。以下代码取自文档。它创建了一个不透明的int typedef。它与int有相同的接口(可以添加、移位、递增、比较等),但参数和返回值是新创建的类型,而不是int:

#include "opaque/numeric_typedef.hpp"
struct myint : opaque::numeric_typedef<int, myint> {
  using base = opaque::numeric_typedef<int, myint>;
  using base::base;
};

有一个名为enum class的c++11特性,它基本上是一个类型安全的枚举。也许他们可以在这里帮忙。

在foonathan 2016年的博客文章中,涵盖了各种方法,从一个简单案例的示例类开始:

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

您可以检查函数中的类型,这样,如果不匹配,您可以打印错误或其他内容。

您可以使用typeid来检测变量类型,如下所示:

typeid(*variablename*).name()

正如这里的一个答案所建议的那样,这取决于编译器,您必须使用try-and-error方法来找出哪个值适合您。