You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:43:27