我可以在 C++ 中创建一个强类型整数吗?
Posted
技术标签:
【中文标题】我可以在 C++ 中创建一个强类型整数吗?【英文标题】:Can I make a strong typed integer in C++? 【发布时间】:2012-05-19 14:46:42 【问题描述】:我想要一个在 Visual Studio 2010 中编译的 C++ 中的强类型整数。
我需要这种类型在某些模板中充当整数。特别是我需要能够:
StrongInt x0(1); //construct it.
auto x1 = new StrongInt[100000]; //construct it without initialization
auto x2 = new StrongInt[10](); //construct it with initialization
我见过这样的事情:
class StrongInt
int value;
public:
explicit StrongInt(int v) : value(v)
operator int () const return value;
;
或
class StrongInt
int value;
public:
StrongInt() : value(0) //fails 'construct it without initialization
//StrongInt() //fails 'construct it with initialization
explicit StrongInt(int v) : value(v)
operator int () const return value;
;
因为这些东西不是 POD 的,所以它们不能很好地工作。
【问题讨论】:
嗯,它需要一个无参数的数组构造函数,它需要一个赋值运算符来分配实际值,然后就是这样。我错过了什么吗? @EitanT -- 在 C++11 中,他们回收了auto
关键字来表示新的东西 -- 现在它的意思是“自动推断类型”。在这里使用它有点傻,但是对于难以键入的复杂模板类型名称来说,它确实很方便。
@EitanT:我确实看到了 [visual-studio-2010] 标签,VC10 编译器确实支持新的auto
。
@EitanT:如果您没有听说过,此代码现在符合标准。 C++11 标签并不是绝对必要的(而且似乎毫无意义,因为auto
的使用或不使用不会以任何方式影响问题)。
@BenVoigt 我还没有更新“改进的”auto
关键字,但是在 C++03 中它不能编译,所以我觉得有必要将它标记为 C++ 11.但你说得对,它与问题本身无关。
【参考方案1】:
当我想要一个强类型整数时,我只是使用枚举类型。
enum StrongInt _min = 0, _max = INT_MAX ;
StrongInt x0 = StrongInt(1);
int i = x0;
【讨论】:
如何隐式转换为任何整数类型的强类型?enum class
可能有道理...
OP 的示例也可以隐式转换为整数,而且它满足轻松(未)初始化的要求。枚举类型不能互相转换,所以enum StrongInt
和enum Price
和enum Quantity
都是不同的类型,不能互相转换,可以用于重载和特化。使用枚举作为不同的整数类型是一项很棒的技术,尽管我总是很惊讶它并不更常用。
@Jonathan 我得到一个编译器错误:StrongInt x0(1); =>error C2440:“正在初始化”:无法从“int”转换为“StrongInt”。 ---- 但是,我可以通过将代码更改为 StrongInt x0 = StrongInt(1) 来修复编译时错误,而我不能接受在运行时隐藏的未初始化或性能问题。所以我接受这个答案。
@ildjarn 我把它标记为 VS-2010。该编译器不支持枚举类。有人对我使用关键字 auto 有问题,并错误地添加了 C++11 标签。【参考方案2】:
StrongInt x0(1);
因为这些东西不是 POD 的,所以它们不能很好地工作。
这两件事是不兼容的:你不能同时拥有构造函数语法和 POD。对于 POD,您需要使用例如StrongInt x0 1 ;
或 StrongInt x0 = 1 ;
,甚至是 StrongInt x0( 1 );
(这是一个非常迂回的复制初始化)。
【讨论】:
以上是关于我可以在 C++ 中创建一个强类型整数吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以创建自定义 ASP.NET MVC 强类型 HTML Helper?
可以使用 typescript 使 graphql 查询成为强类型吗?