Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to define a pointer cast operator?

Tags:

c++

I'm trying to wrapping an object and want to pass it as a pointer to functions. The object is known can be cast to limited types and I want to provide cast operator for these types. For example:

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

What I expected is to replace GetInt32Ptr() with a cast operator so I can call int32_add() like this int32_add(&a, &b). I tried

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

but it doesn't work.

like image 805
jasonxia Avatar asked Jul 03 '19 08:07

jasonxia


2 Answers

You're almost there, the correct syntax for the operator definition is:

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

Also note that as described here, you can also make these operators explicit, which is often desired to guard against unwanted conversions. It requires more verbosity, when doing the conversion, e.g. static_cast<const int32_t*>(a) instead of just a.

like image 194
lubgr Avatar answered Oct 22 '22 03:10

lubgr


When you want the type to implicitly convert into another you have to declare that as an operator method:

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

Now, in order to call the functions just say a, b and they are implicitly converted:

std::cout << "32bit a + b = " << int32_add(a, b) << std::endl;
std::cout << "32bit a + b = " << int64_add(a, b) << std::endl;

Note: your function qualifiers aren't consistent (const int32_t*)

they all should be const T* const

also std::endl is generally wrong, replace it with '\n' - reasoning

like image 35
Stack Danny Avatar answered Oct 22 '22 02:10

Stack Danny