![](/img/trans.png)
[英]C++: How call a function with type parameter on variadic template arguments?
[英]C++ pass function to call by template type by parameter
我有一个类A
,它包装着T
型模板对象容器。 在这种用例中, T
应该是一个类。 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所说的,只要您至少知道要转发的参数数量 (类型可以“模板化”)并仅为该数量的参数定义一个函数(或使用重载的多个函数),就可以。 无法为任何数量的参数创建函数转发器。
这仅在C ++ 11中使用“可变模板”功能才能实现:
template <class T, class Function, class... Args>
void A::callFunction(Function functionToCall, Args... functionParams) {
bind(objectT, functionToCall, functionParams...);
}
注意:
objectT->functionToCall(functionParams, ...);
根本不可能,因为您不能将在类内部定义的符号指定为“自由符号”。 但是,您可以尝试利用“指向成员的指针”功能并执行以下操作:
(objectT->*functionToCall)(functionParams, ...);
只要此“ functionToCall”是指向对象objectT指向的类的成员函数的指针。 例如:
x->callFunction(&T::something, a, b);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.