将类隐式转换为 int 的正确方法是啥?

Posted

技术标签:

【中文标题】将类隐式转换为 int 的正确方法是啥?【英文标题】:What is the right way to implicitly convert a class to an int?将类隐式转换为 int 的正确方法是什么? 【发布时间】:2014-11-17 20:15:32 【问题描述】:

以下类应用作普通数组或 std::vector 的索引。它基本上有助于从 C 接口访问数组的地址计算。

class Index

    public:
        int data;

        inline void manipulate(Argument arg)
           // do some manipulation on data
        

;

为了使用如下语句实现自动转换的正确方法是:

Index myIndex;
...
a[myIndex] = A(...)
f(myIndex); // f is defined as f(int idx)...

附带问题:这个类会完全使用一个 int 的存储空间吗?

【问题讨论】:

你读过这个吗 - ***.com/questions/2143020/… "It's almost always a good idea to avoid writing automatic conversions"。另见C++ Coding Standards 【参考方案1】:

您可以定义一个隐式转换运算符:

class Index

    int data;
public:
    // ...
    operator int() const  return data;     
;

侧面回答:也许。

【讨论】:

那不是很危险吗?我的意思是 int() 作为运算符?真的 :(? @hagubear:这是一个糟糕的想法,而且风险很大,但这就是你所要求的。 @hagubear:当被问及射中你女儿脚的正确方法时,你宁愿我打电话给孩子抚养费还是把 12 号尺交给你?有些问题没有正确答案。 @Michael 最好是显式,比如添加getData()toInt() 之类的函数 @Michael:我不知道你想要什么——很可能是 XY 问题?【参考方案2】:

在害虫和霍乱之间进行选择:

// Explicit Constructor
struct FirstIndex

    int data;
    explicit FirstIndex(const int& data)
    :   data(data)
    

    operator const int& () const  return data; 
    operator int& ()  return data; 
;
bool operator == (const FirstIndex& a, const FirstIndex& b)  return a.data == b.data; 

// Explicit Conversion
struct SecondIndex

    int data;
    SecondIndex(const int& data)
    :   data(data)
    

    explicit operator const int& () const  return data; 
    explicit operator int& ()  return data; 
;
bool operator == (const SecondIndex& a, const SecondIndex& b)  return a.data == b.data; 

// Nothing Explicit
struct ThirdIndex

    int data;
    ThirdIndex(const int& data)
    :   data(data)
    

    operator const int& () const  return data; 
    operator int& ()  return data; 
;
bool operator == (const ThirdIndex& a, const ThirdIndex& b)  return a.data == b.data; 

int main()

    FirstIndex first(0);
    int first_result = 0;
    first += 1;
    // no match for ‘operator=’
    // first = first + 1;
    first_result = first;
    first_result == first;

    SecondIndex second(0);
    int second_result = 0;
    // error: no match for ‘operator+=’
    // second += 1;
    // no match for ‘operator+’
    // second = second + 1;
    // cannot convert ‘SecondIndex’ to ‘int’
    // second_result = second;
    second_result == second;

    ThirdIndex third(0);
    int third_result = 0;
    third += 1;
    third = third + 1;
    third_result = third;
    // This one is significant
    // error: ambiguous overload for ‘operator==’
    // third_result == third;

【讨论】:

以上是关于将类隐式转换为 int 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

大数据(7n)Scala隐式转换

C语言 显式 隐式是啥意思

在 C# 中将对象数组隐式转换为 int 数组

当类依赖于隐式时,是否存在将类转换为Object的惯用方法?

scala中隐式转换之总结

Scala隐式转换