我正在使用一个使用通常的 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(),但我无法让它以任何其他方式工作。
将此作为答案发布,因为评论中的讨论不知何故陷入困境,我不明白为什么它不是替代方案。按值返回指针:
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)
正如您所提到的,引用将是对临时对象的引用,因此非常量引用无论如何都没有什么用处。