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

时间:2015-01-16 13:24:48

标签: c++ templates c++98

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

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

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

objectT的类型为T,functionToCall为void

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

2 个答案:

答案 0 :(得分:2)

有可能,例如:

#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);
}

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

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

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

也应该工作..

答案 1 :(得分:1)

正如@Nim所说,只要您至少知道要转发的数量参数(类型可以是&#34;模板化&#34;),就可以了。仅为该数量的参数(或使用重载的多个函数)定义函数。没有可能为任意数量的参数创建函数转发器。

这只能在C ++ 11中使用&#34;可变参数模板&#34;特征:

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

请注意:

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

根本不可能,因为您无法将类中定义的符号指定为&#34;自由符号&#34;。但是你可以尝试利用&#34;指向成员的指针&#34;功能并执行此操作:

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

只要这个&#34; functionToCall&#34;是指向对象 objectT 指向的类的成员函数的指针。例如:

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