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);
我有一个 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);