如何获取*this的引用限定符并转发*this以避免重复实现成员函数?
转发
*this与复用引用限定成员函数 正如cppreference所述:
与cv限定不同,引用限定(ref-qualification)不会改变
this指针的属性:在右值引用限定的函数中,*this仍然是左值表达式。
一、用std::forward_like(C++23)简化实现
C++23引入的std::forward_like可以直接根据对象的引用和cv限定转发*this,让你只写一次核心逻辑,就能适配所有引用限定的成员函数。
示例代码:
#include <utility> class MyClass { // 内部操作,仅实现一次 auto some_internal_operation() & { /* 左值逻辑 */ } auto some_internal_operation() && { /* 右值逻辑 */ } // 对应const版本... public: // 模板函数,利用this参数推导自身的限定 template <typename Self> auto func(this Self&& self) { // 保持self的原始引用/cv限定转发 return std::forward_like<Self>(self).some_internal_operation(); } };
这样就不需要分别写func() &、func() &&等重载,模板会自动匹配调用者的引用类型。
二、C++23之前的手动转发方案
在旧标准中,可以通过静态模板函数接收转发后的*this,复用核心逻辑:
class MyClass { private: // 核心逻辑实现,通过模板参数接收不同限定的对象 template <typename T> static auto impl(T&& self) { return std::forward<T>(self).some_internal_operation(); } public: // 不同引用限定的接口统一转发到impl auto func() & { return impl(*this); } auto func() && { return impl(std::move(*this)); } auto func() const& { return impl(*this); } auto func() const&& { return impl(std::move(*this)); } };
三、获取*this的引用限定信息
如果需要显式判断当前对象的引用类型,可以结合decltype和类型特性模板:
#include <type_traits> class MyClass { public: void func() & { // 验证当前是左值对象 static_assert(std::is_lvalue_reference_v<decltype(*this)>); // 左值专属逻辑 } void func() && { // 验证当前是右值对象 static_assert(std::is_rvalue_reference_v<decltype(std::move(*this))>); // 右值专属逻辑 } };
内容的提问来源于stack exchange,提问作者nullptr
相关产品推荐
相关产品推荐

