我有一个类A
,它是T
类型的模板对象容器的包装器。 T
预计将成为此用例中的一个类。 A
对所提供的T
类型没有任何参考。
有没有办法在A
中实现一个函数来调用参数传递的T
函数?伪代码:
template <class T>
void A:callFunction(functionToCall, functionParams, ...) {
objectT->functionToCall(functionParams, ...);
}
objectT的类型为T
,functionToCall为void
我无法找到在C ++ 98中是否真的无法做到以及为什么。任何可能的解决方法也会有所帮助。
答案 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);