如何解决将所有未知的方法调用和属性使用转发到 C++ 中的特殊函数
在 C++ 中,如果我有某个类 Class obj;
的对象,我希望能够拦截和处理任何名称和参数的方法调用,例如 obj.add(123)
,还可以处理任何属性用法,例如 {{ 1}}。
问题是我不知道将使用什么方法或属性名称,例如可以使用 auto x = obj.value;
或 obj.abc(1,2,true)
。
因此,如果有人调用 auto x = obj.xyz;
,我希望使用参数 obj.abc(1,true)
调用 next 方法:
("abc",1,true)
或者如果使用了属性 template <typename ... Args>
std::any ProcessMethod(std::string const & method_name,Args && ... args) {/*...*/}
我希望使用 auto x = obj.xyz;
参数调用下一个方法:
("xyz")
上述两种方法使用运行时方法。更好的是我在编译时传递调用的方法或属性名称(作为编译时固定字符串)。这样我就可以在编译时找出方法返回类型或属性类型,即 do(对于某些在编译时保存字符串的特殊类 FixedString):
std::any ProcessProperty(std::string const & property_name) {/*...*/}
是否有可能拦截对未知方法或属性的所有调用并将它们转发到上面的最后两个方法?
当然我可以使用下一个语法:template <FixedString method_name,typename ... Args>
typename ReturnTypeOf<method_name>::type ProcessMethod(Args && ... args) {/*...*/}
template <FixedString property_name>
typename PropertyTypeOf<property_name>::type & ProcessProperty() {/*...*/}
和 obj.call<"abc">(1,true)
来解决我的任务,但是如果可以在 C++ 中以任何方式解决我想继续使用语法 auto x = obj.prop<"xyz">();
和obj.abc(1,true)
。
上面的最后一个语法是否可以通过 C++ 反射或模板魔术来实现?
解决方法
这在 C++ 中是不可能的。您不能以这种方式 (**) 重载 .
运算符。这更像是一种动态语言功能。
如果您真的想要,您可以编写一个编译器扩展来将 a.b(arg)
转换为 a.call("b",arg)
,其中 b
已知不是 a
的成员。
** 已经讨论过重载 .
,但该设计不支持您想要的。请参阅:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4477.pdf
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。