3

我尝试将 int8_t 的引用转换为 uint8_t 的引用。

我有以下代码:

inline mtype& operator&(mtype& mt, uint8_t& va) {
  // do something
  // ...

  return mt;
}

inline mtype& operator&(mtype& mt, int8_t& va) {
  // do the same but signed
  // ...

  return mt;
}

由于两个重载都做同样的事情,我想干燥(或更好的drm),所以我想用 . 调用第一个运算符casted va。但我该怎么做?这行不通。

inline mtype& operator&(mtype& mt, int8_t& va) {
  return mt& static_cast<uint8_t>(va); //  error: no match for 'operator&' in 'mt & (uint8_t)va'
}

我该怎么做?

4

4 回答 4

6

您想重新解释数据是什么。

inline mtype& operator&(mtype& mt, int8_t& va) {
  return mt& reinterpret_cast<uint8_t&>(va);
}

不过要小心。根据“做相同但签名”的含义,您可能不会通过调用相同的函数并假设数据始终是unsigned来做正确的事情。

如果您的代码正在执行具有唯一签名/未签名逻辑的工作(尽管代码看起来相同),您将需要使用模板函数来生成正确的特定于类型的逻辑。

template< Typename T >
mtype& do_the_work( mtype& mt, T& va )
{
  // do something

  // (Here's an example of code that LOOKS the same, but doesn't DO the same)
  va = va >> 1;
}

inline mtype& operator&(mtype& mt, uint8_t& va) {
  return do_the_work( mt, va );
}

inline mtype& operator&(mtype& mt, int8_t& va) {
  return do_the_work( mt, va );
}
于 2013-04-18T21:46:18.240 回答
1
inline mtype& operator&(mtype& mt, int8_t& va) {
  return mt & reinterpret_cast<uint8_t&>(va);
}
于 2013-04-18T21:46:07.537 回答
1

您得到的错误是因为强制转换导致值而不是引用。

你应该使用:

reinterpret_cast<uint8_t&>(va)
于 2013-04-18T21:46:26.447 回答
0

您的问题是您正在转换为非常量值,但您的函数需要非常量引用。

几乎可以肯定,您真正想要的是运算符按值接受第二个参数(如果您operator&确实改变了它的右手运算符,您需要重新考虑您的运算符):

inline mtype& operator&(mtype& mt, uint8_t va) {
  // do something
  // ...

  return mt;
}

inline mtype& operator&(mtype& mt, int8_t va) {
  return mt& static_cast<uint8_t>(va); //  error: no match for 'operator&' in 'so & (uint8_t)va'
}
于 2013-04-18T21:53:40.897 回答