C ++ :: Template functions-从object.function获取对象的地址

时间:2016-03-04 09:13:58

标签: c++ function templates object lambda

我想避免使用两个参数。所以我们有:

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

2 个答案:

答案 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语法......