我可以在 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 StrongIntenum Priceenum 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 查询成为强类型吗?

Angular 强类型反应形式

Intellisense 声明强类型 DataSet 查询的参数是 Decimal,而它应该是 String

如何用python的装饰器定义一个像C++一样的强类型函数