将类隐式转换为 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 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章