我有一个来自另一个图书馆的课程,我正在包装但不能修改,比如说:
class A {
public:
float mem(int a);
/* many more functions */
};
我用一个类来包装它,该类将A的实例保存为成员变量:
class B {
public:
A get() { return m_a; }
private:
A m_a;
};
现在,要调用A
的成员函数,我绝对可以这样做:
B.get().mem(2);
重复调用成员函数会很麻烦,并且为所有成员函数编写包装器并不可行。所以我的想法是重载->*
运算符来调用这些函数:
B->*mem(2);
我正在努力解决的是需要传递给->*
运算符的函数的类型。我实际上无法找到任何实际上重载此运算符而不完全更改其功能的示例。我最好的猜测是它会像这样:
template<class A::func, class return_type, class... args>
return_type operator->*(A::func(args)) {
return m_a.*(A::func(args...));
}
我认为它必须是模板化的,但是模板推导可以正确地选择函数,它的参数和它的返回类型吗?
或者返回类型可能是decltype(auto)
?成员函数的实际类型是什么?