将 C Cast 宏转换为 C++ 函数

Jac*_*aib 1 c++

我正在使用一个使用通常的 C“继承”技巧的 C 库

typedef struct Base_ *BasePointer;
struct Base_ {
};

typedef struct Derived_ *DerivedPointer;
struct Derived_ {
  Base_ header;
};

#define BaseCast(obj) ((BasePointer)(obj))

void bar(BasePointer);

void foo(DerivedPointer derived)
{
  bar(BaseCast(derived));
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一些 C++ 实用程序,其中一个实用程序是一种更安全的实用程序,BaseCast()使用类型特征来检查对象是否确实是派生的。这BaseCast()必须与宏完全互换。我有以下内容,但是可以做得更好吗?

// convertible_to_base checks for existence of object->header
// and that object->header is of type Base_

template <typename T>
[[nodiscard]] static inline constexpr BasePointer& BaseCast(T& object) noexcept
{
  static_assert(util::convertible_to_base<T>::value, "");
  return reinterpret_cast<BasePointer&>(object);
}

template <typename T>
[[nodiscard]] static inline constexpr const BasePointer& BaseCast(const T& object) noexcept
{
  static_assert(util::convertible_to_base<T>::value, "");
  return reinterpret_cast<const BasePointer&>(object);
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢reinterpret_cast(),但我无法让它以任何其他方式工作。

for*_*818 5

将此作为答案发布,因为评论中的讨论不知何故陷入困境,我不明白为什么它不是替代方案。按值返回指针:

template <typename T>
[[nodiscard]] static inline constexpr BasePointer BaseCast(const T& object) noexcept
{
  static_assert(util::convertible_to_base<T>::value, "");
  return &object.header;
}
Run Code Online (Sandbox Code Playgroud)

正如您所提到的,引用将是对临时对象的引用,因此非常量引用无论如何都没有什么用处。