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

如何填写注释内容使传入类成员getter/setter的property调用可正常编译?

解决方案

两个注释位置填写内容如下:

  1. getter参数的注释位替换为:Get (Class::*)()
  2. setter参数默认按返回void的约定填写:void (Class::*)(Set),如果你的setter约定返回Get类型,此处替换为Get (Class::*)(Set)即可。

调整后的完整property函数定义示例:

template< typename Class, 
          typename Get,
          typename Set,
          typename = std::enable_if< std::is_same< 
              Get,
              typename std::remove_cv< typename std::remove_reference< typename std::remove_pointer< Set >::type >::type >::type >::value
          > 
>
constexpr auto property (
    const char* name,
    reflection::function< Get (Class::*)() > getter,
    reflection::function< void (Class::*)(Set) > setter
) {
    return nullptr;
}

补充说明

  • 如果你的getter是const成员函数,需要给reflection::function补充const成员函数指针的特化:
    template < typename Class, typename Ret, typename ... Args >
    class function < Ret ( Class::* ) ( Args... ) const > {
    public:
        constexpr function( Ret ( Class::*method )( Args... ) const ) {}
        /* 原有实现逻辑 */
    };
    
    同时将getter对应的模板参数改为Get (Class::*)() const即可。
  • 如果你需要支持setter返回任意类型(比如返回类引用实现链式调用),可以调整property的模板参数,增加setter返回值的自动推导,C++17及以上版本简化写法如下:
    template< typename Class, 
              typename Get,
              typename Set,
              typename SetRet,
              typename = std::enable_if_t< std::is_same_v< 
                  Get,
                  std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<Set>>>
              >> 
    >
    constexpr auto property (
        const char* name,
        reflection::function< Get (Class::*)() > getter,
        reflection::function< SetRet (Class::*)(Set) > setter
    ) {
        return nullptr;
    }
    

内容的提问来源于stack exchange,提问作者OmniSudo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:15:02