我想避免使用两个参数。所以我们有:
class A;
void A::boo();
我想转此代码:
template <class C>
void foo(C &c, void (C::*func)())
{
(c.*func)();
}
A a;
foo(a, &a.boo);
对此:
template <class C, C &c> // Something similar
void foo(void (C::*func)())
{
(c.*func)();
}
A a;
foo(&a.boo); // Since I'm using the reference of the object instance
我相信我明白C ++中的模板是简单的字符串替换,但我观察到它们的实现稍微高级和灵活。我也相信我掌握了班级及其成员职能的概念;函数的内存中有一个地址,类实例就像函数的一个参数,以便访问该类实例的内存中的成员。
所以,这样做是不是有办法去做我想做的事情?
编辑:
我的坏,错过了&amp;标志。更正:&amp; a.boo
答案 0 :(得分:2)
最简单的方法是接受一个将操作绑定的仿函数:
template <class F>
void foo(F f)
{
f();
}
A a;
foo( [&a](){ a.boo(); } );
或者,没有lambda:
A a;
foo(std::bind(&A::boo, &a));
答案 1 :(得分:0)
这不是C ++的工作方式。当你传递一个函数时,你真的传递了它的地址。因此,如果A::foo
是静态的或非虚拟的,则它的所有对象(以及A的子类)的地址都是相同的。
即使它是虚拟的,每个子类也会有一个foo
个实例,同一个子类的两个不同对象将具有foo
的相同地址。
这意味着即使您编写a.foo
,在运行时也无法找到您使用的对象:所有对a
的引用都已消失。
唯一可行的方法 - 但请注意我不建议使用它,因为可能存在极端情况 - 将使用宏,因为它们是在编译时执行的。像
这样的东西#define FOO(a,b) foo(a, a.b)
可以允许保留对编译时给出的对象的引用。
TL / DR:C ++不支持绑定方法的Python语法......