【发布时间】:2011-06-20 14:12:56
【问题描述】:
我不知道我问的是可行的、愚蠢的还是简单的。 我最近才开始研究模板函数和类,我想知道以下情况是否可能: 包含要调用的函数指针的类。函数指针不能是具体的,而是抽象的,这样每当类的构造函数被调用时,它就可以接受不同种类的函数指针。当调用类的执行函数时,它会执行在构造时分配的函数指针,并带有一个(或多个)参数。 基本上,在整个设计中都保留了抽象,并将传递什么函数指针和参数留给用户。以下代码未经测试,只是为了演示我正在尝试做的事情:
void (*foo)(double);
void (*bar)(double,double);
void (*blah)(float);
class Instruction
{
protected:
double var_a;
double var_b;
void (*ptr2func)(double);
void (*ptr2func)(double,double);
public:
template <typename F> Instruction(F arg1, F arg2, F arg3)
{
Instruction::ptr2func = &arg1;
var_a = arg2;
var_b = arg3;
};
void execute()
{
(*ptr2func)(var_a);
};
};
我不喜欢我必须在可能的可重载函数指针类中保留一个列表。我怎么可能改进上述内容以尽可能地概括它,以便它可以与抛出的任何类型的函数指针一起工作? 请记住,我将要保留这些实例化对象的容器并按顺序执行每个函数指针。 谢谢 ! 编辑:也许这个类应该是一个模板,以便于使用许多不同的函数指针? Edit2:我找到了解决我的问题的方法,仅供将来参考,不知道它是否正确,但它有效:
class Instruction
{
protected:
double arg1,arg2,arg3;
public:
virtual void execute() = 0;
};
template <class F> class MoveArm : public Instruction
{
private:
F (func);
public:
template <typename T>
MoveArm(const T& f,double a, double b)
{
arg1 = a;
arg2 = b;
func = &f;
};
void execute()
{
(func)(arg1,arg2);
};
};
但是在导入函数时,它们的函数指针需要typedef:
void doIt(double a, double b)
{
std::cout << "moving arm at: " << a << " " << b << std::endl;
};
typedef void (*ptr2func)(double,double);
int main(int argc, char **argv) {
MoveArm<ptr2func> arm(doIt,0.5,2.3);
arm.execute();
return 0;
}
【问题讨论】:
-
boost::function和boost::bind如果你想要模板函子? -
好像你在重新发明
boost::function: boost.org/doc/libs/1_46_1/doc/html/function/… -
对我来说,听起来他想保存具有任意签名的函数指针/对象;这不是
boost::function所做的事情。您应该考虑使用std::bind/boost::bind创建一个包装参数的函子。 -
我不知道boost已经有这个功能,但即使有,我还是想了解这是怎么做到的。将研究 boost 以了解它是如何工作的。谢谢。
标签: c++ templates function pointers abstraction