如何定义指针铸件操作员

how to define a pointer cast operator?

本文关键字:指针 操作员 定义 何定义      更新时间:2023-10-16

我正在尝试包装对象,并希望将其作为函数指针传递。该对象已知可以被铸造为有限类型,我想为这些类型提供铸造操作员。例如:

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(&a, &b)一样调用int32_add()。我尝试了

    const int32_t*() const { return &int32_storage_; }
    const int64_t*() const { return &int64_storage_; }

但是它不起作用。

您快到了,操作员定义的正确语法为:

operator const int32_t*() const { return &int32_storage_; }
operator const int64_t*() const { return &int64_storage_; }

还要注意,如下所述,您还可以使这些操作员explicit通常需要防止不需要的转换。进行转换时需要更多的详细性,例如static_cast<const int32_t*>(a)而不是a

当您希望该类型隐式转换为另一种类型时,您必须将其声明为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'替换为CCO_12-推理

您缺少操作员关键字。

operator const int32_t* () const { return &int32_storage_; }
operator const int64_t* () const { return &int64_storage_; }