我正在尝试包装一个对象,并希望将其作为函数的指针传递。已知该对象可以强制转换为有限类型,我想为这些类型提供强制转换运算符。例如:
class MyInt {
public:
MyInt() {}
MyInt(int val): int32_storage_(val), int64_storage_(val*2) {}
const int32_t* GetInt32Ptr() const { return &int32_storage_; }
const int64_t* GetInt64Ptr() const { return &int64_storage_; }
private:
int32_t int32_storage_ = 0;
int64_t int64_storage_ = 0;
};
int32_t int32_add(const int32_t* iptr_a, const int32_t* const iptr_b) {
return *iptr_a + *iptr_b;
}
int64_t int64_add(const int64_t* iptr_a, const int64_t* const iptr_b) {
return *iptr_a + *iptr_b;
}
int main() {
MyInt a(10);
MyInt b(20);
std::cout << "32bit a + b = " << int32_add(a.GetInt32Ptr(), b.GetInt32Ptr()) << std::endl;
std::cout << "64bit a + b = " << int64_add(a.GetInt64Ptr(), b.GetInt64Ptr()) << std::endl;
return 0;
}
我期望将GetInt32Ptr()
替换为强制转换运算符,这样我就可以像这样int32_add()
来调用int32_add(&a, &b)
。我尝试过
const int32_t*() const { return &int32_storage_; }
const int64_t*() const { return &int64_storage_; }
但它不起作用。
答案 0 :(得分:8)
您快到了,运算符定义的正确语法是:
operator const int32_t*() const { return &int32_storage_; }
operator const int64_t*() const { return &int64_storage_; }
还请注意,如here所述,您还可以将这些运算符设置为explicit
,以防止不必要的转换。进行转换时,它需要更多的详细信息,例如static_cast<const int32_t*>(a)
,而不只是a
。
答案 1 :(得分:4)
当您希望类型隐式转换为另一个类型时,必须将其声明为operator
方法:
operator const int32_t*() const { return &int32_storage_; }
operator const int64_t*() const { return &int64_storage_; }
现在,要调用这些函数,只需说a, b
,它们就会隐式转换:
std::cout << "32bit a + b = " << int32_add(a, b) << std::endl;
std::cout << "32bit a + b = " << int64_add(a, b) << std::endl;
注意:您的函数限定符不一致(const int32_t*
)
全部应该是 const T* const
std::endl
通常也是错误的,将其替换为'\n'
-reasoning
答案 2 :(得分:1)
您缺少运算符关键字。
operator const int32_t* () const { return &int32_storage_; }
operator const int64_t* () const { return &int64_storage_; }