C ++传递函数以通过参数按模板类型调用

C++ pass function to call by template type by parameter

我有一个 class A,它是 T 类型模板对象容器的包装器。 T 在此用例中预计为 class。 A 对所提供的 T 类型没有任何参考。

有没有办法实现A中的函数调用传参T中的函数?伪代码:

template <class T>
void A:callFunction(functionToCall, functionParams, ...) {
        objectT->functionToCall(functionParams, ...);
}

objectT 是 T 类型,functionToCall 是 void

我没能找到在 C++98 中是否真的不可能以及为什么。任何可能的解决方法也会有所帮助。

可以,例如:

#include <iostream>
using namespace std;

struct bar
{
  void say(int a, int b)
  { cout << a << ' ' << b << endl; }
};

template <typename T>
struct foo
{
  template <typename fptr>
  void say(fptr f, int a, int b)
  {
    (i.*f)(a, b);
  }

  T i;
};

int main() {
  foo<bar> f;
  f.say(&bar::say, 10, 100);
}

(例如在 gcc 上这将使用 -std=c++98 编译)

如果您不想为成员函数使用模板参数,例如;

void say(void (T::*f)(int, int), int a, int b)
{
  (i.*f)(a, b);
}

也应该工作..

正如@Nim所说,这是可能的,只要您至少知道要转发的参数的数量(类型可以是"templated")并定义一个仅对那个数量的参数起作用(或使用重载的多个函数)。无法为任意数量的参数创建函数转发器。

这只能在 C++11 中使用 "variadic template" 特性实现:

template <class T, class Function, class... Args>
void A::callFunction(Function functionToCall, Args... functionParams) {
    bind(objectT, functionToCall, functionParams...);
}

注意这个:

objectT->functionToCall(functionParams, ...);

根本不可能,因为您不能将 class 内定义的符号指定为 "free symbol"。但是,您可以尝试利用 "pointer to member" 功能并执行此操作:

(objectT->*functionToCall)(functionParams, ...);

只要这个 "functionToCall" 是指向 class 的成员函数的指针,对象 objectT 指向。例如:

x->callFunction(&T::something, a, b);