【问题标题】:C++ member function applied to object应用于对象的 C++ 成员函数
【发布时间】:2011-01-11 13:16:22
【问题描述】:

我想通过将成员函数作为模板参数传递来调用它,而不使用 boost 是可能的。这是我尝试做的一个例子,

class object { void method(); }

{
object object_instance;
...
apply<object:: method>();
...

template<class F>
void apply() { F(object_instance); } // want to call object_instance.F()
}

这不起作用,所以问题是如何将对象方法绑定到对象。 谢谢

上面是一个例子,不是真正的代码。我有一堆函数,只是名称不同,但有很多参数,我想在运算符中包含它们。

【问题讨论】:

    标签: c++ methods functional-programming member


    【解决方案1】:

    类似:

    struct foo
    {
        void bar(void) {}
    };
    
    template <typename R, typename C>
    R apply(C& pObject, R (C::*pFunc)())
    {
        return (pObject.*pFunc)();
    }
    
    int main(void)
    {
        foo f;
        apply(f, &foo::bar);
    }
    

    这个。

    【讨论】:

    • 谢谢,我正试图这样做。我已经阅读了 .* 运算符,但这是第一次实际使用它
    • 没问题。您必须生成或手动编写不同的变体以允许参数传递。 Boost.Preprocessor 在这里会有所帮助。 (虽然如果你使用 boost,你只需要使用 boost::bind。你没有使用 boost :P)
    • 其实参数是一样的,应用在apply函数里面,所以对我来说效果很好。应该提供了真实的代码。再次感谢
    【解决方案2】:

    这类似于您的代码,并且允许将成员函数作为模板参数传递:

    class object { public: void method() {} };
    object object_instance;
    
    template<void (object::*F)()>
    void apply() {
        (object_instance.*F)();
    }
    
    int main() {
        apply<&object::method>();
        return 0;
    }
    

    【讨论】:

    • 不会有方法总是在同一个对象实例上调用的问题吗?
    • 是的,但原始代码似乎就是这样做的,所以我保持不变。实例可以作为参数传递给应用。
    【解决方案3】:

    由于成员函数不是类型或整数值,因此您不能将其作为模板参数传递。你可以通过创建一个调用成员函数的结构来做你想做的事,尽管在模板的范围内有 object_instance 是相当臭的。

    你实际上想做什么?

    【讨论】:

      【解决方案4】:

      此示例适用于 c++ox 中的右值引用。不适用于所有编译器。

      class Sample
      {
      public:
          void fun() { cout << "Sample::fun\n"; }
      };
      
      template<typename Function>
      void FunCall( Function&& f)
      {
          f();
      }
      
      void RvaluesDemo()
      {
          FunCall([&]
          {
              Sample().fun();
          });
      }
      

      【讨论】:

      • 我没有,所以我只是猜测,但可能是因为问题没有标记 C++0x。
      • @GMan:没问题。但这比编写不同的变体来允许参数传递要灵活得多。
      • 好吧,但这个问题根本不是关于 C++0x 的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多