【问题标题】:Template pass member function with args and return value as parameter c++带有args和返回值作为参数c ++的模板传递成员函数
【发布时间】:2017-09-06 16:14:40
【问题描述】:

我想为类传递一个模板函数 args 和该类的一个方法来调用。该方法有参数和返回值。

这是我目前所拥有的。我相信我对模板化的函数语法有点迷惑:

bar.h

    class Bar {
     public:
       Bar();
       int FuncBar(int arg1);
    }

foo.h

    template<typename A, int (A::*Method)()>
    int FuncTemplate(A* a, int bar_arg1) {
      ....
      return a->Method(bar_arg1)
    }


    class Foo { 
     public:
       explicit Foo(Bar* bar);

     private:
       void FuncFoo();
       Bar* bar_;
    }

foo.cc

    Foo::Foo(Bar bar) : bar_(bar) {};
    void Foo::FuncFoo() {
      ...
      int bar_arg1 = 0;
      FuncTemplate<Bar, &(*bar_)::FuncBar>(bar_, bar_arg1);
    }

【问题讨论】:

  • 错误是什么,发生在哪里?
  • *a 不是类型。你想要类似decltype(*a) 或只是&amp;A::FuncBar
  • 在 foo.cc 中,a 是什么?
  • appologies,应该是吧_

标签: c++ function templates


【解决方案1】:

您需要使用int (A::*Method)(int) 作为函数指针类型,因为成员函数需要int 作为参数。

另外,对成员函数的调用必须是(a-&gt;*Method)(bar_arg1)。使用成员函数调用成员函数的语法不是很直观。

template<typename A, int (A::*Method)(int)>
int FuncTemplate(A* a, int bar_arg1) {
  ....
  return (a->*Method)(bar_arg1)
}

另外,您需要使用&amp;Bar::FuncBar 来获取指向成员函数的指针,而不是&amp;(*bar_)::FuncBar。

void Foo::FuncFoo() {
   int bar_arg1 = 0;
   FuncTemplate<Bar, &Bar::FuncBar>(bar_, bar_arg1);
   //                ^^^^^^^^^^^^^
}

【讨论】:

  • 跟进:是否可以使用模板化参数作为方法的参数?或者以其他方式不包括它们?例如。模板
  • @MattStokes,我不明白这个问题。
  • 如果我有第二个函数,我想使用这个模板,而不是 int 参数一个字符串。您能否将参数类型模板化为 Method: template OR template
  • 是的,你可以。如果您无法使其工作,请提出一个 mcve 并将其发布在另一个问题中。
  • 不幸的是,此解决方案无法编译。我收到以下错误:1) a->*Method expected unqualified-id 2) 候选模板被忽略:模板参数'Method'的显式指定参数无效
猜你喜欢
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多