typesafe typedef in C++
typesafe typedef in C++
我想在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方法来找出哪个值适合您。
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp