6

我正在尝试包装一个对象并希望将其作为指向函数的指针传递。已知该对象可以转换为有限类型,我想为这些类型提供转换运算符。例如:

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_; }

但它不起作用。

4

3 回答 3

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.

于 2019-07-03T08:13:55.983 回答
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'-推理

于 2019-07-03T08:19:48.507 回答
1

您缺少 operator 关键字。

operator const int32_t* () const { return &int32_storage_; }
operator const int64_t* () const { return &int64_storage_; }
于 2019-07-03T08:15:07.307 回答