【问题标题】:C++:: Template functions- Get address of object from object.functionC++:: 模板函数 - 从 object.function 获取对象的地址
【发布时间】:2016-03-04 09:13:57
【问题描述】:

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

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++ 中的模板是简单的字符串替换,但我观察到它们的实现稍微更高级和更灵活。我也相信我掌握了类及其成员函数的概念;函数在内存中的一个地址和类实例就像函数的参数一样,以便访问该类实例在内存中的成员。

那么,解决这个问题,有没有办法做我想做的事?

编辑:

我的错,错过了 & 标志。更正:&a.boo

【问题讨论】:

  • C++ 模板远不及简单的字符串替换。在您的示例中,foo 应该从哪里获得 c?您希望将其作为模板参数传递吗?
  • 并且foo(a, a.boo) 不应该编译。你的意思是foo(a, &amp;A::boo)
  • C++ 有时很麻烦:你总是需要对象和成员函数指针!

标签: c++ function templates object lambda


【解决方案1】:

最简单的方法是接受一个函子,它将实例绑定到调用:

template <class F>
void foo(F f)
{
    f();
}

A a;
foo( [&a](){ a.boo(); } );

或者,没有 lambda:

A a;
foo(std::bind(&A::boo, &a));

【讨论】:

    【解决方案2】:

    这不是 C++ 的工作方式。当你传递一个函数时,你实际上传递了它的地址。因此,如果A::foo 是静态的或非虚拟的,则其地址对于 A 类(及其子类)的所有对象都是相同的。

    即使它是虚拟的,每个子类也将拥有一个foo 实例,并且同一子类的两个不同对象将具有相同的foo 地址。

    这意味着即使您编写了a.foo,在运行时也无法找到您使用的对象:所有对a 的引用都消失了。

    唯一可能的方法 - 但请注意,由于可能存在极端情况,我建议使用它 - 将使用宏,因为它们是在编译时执行的。类似的东西

    #define FOO(a,b) foo(a, a.b)
    

    可以允许保留对在编译时给出的对象的引用。

    TL/DR:C++ 不支持绑定方法的 Python 语法...

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 2018-10-19
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多