如何填写注释内容使传入类成员getter/setter的property调用可正常编译?
解决方案
两个注释位置填写内容如下:
- getter参数的注释位替换为:
Get (Class::*)() - 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成员函数指针的特化:
同时将getter对应的模板参数改为template < typename Class, typename Ret, typename ... Args > class function < Ret ( Class::* ) ( Args... ) const > { public: constexpr function( Ret ( Class::*method )( Args... ) const ) {} /* 原有实现逻辑 */ };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
相关产品推荐
相关产品推荐

