所以我不能dynamic_cast< functionPointer>(((void *)(myFuncPtr)))?我该怎么办?

时间:2011-04-02 00:04:12

标签: c++ function-pointers dynamic-cast

我有一个基类,参数和两个派生类:Scalar&向量。在每个派生类中,我有一个成员函数,它将函数指针作为输入:

在Scalar类中:

typedef double (*samplerType)(RandNum& rnState);
void RegisterSampler( samplerType input );

在Vector类中:

typedef std::vector<double> (*samplerType)(RandNum& rnState);
void RegisterSampler( samplerType input );

请注意不同的退货类型:doublestd::vector<double>。我想在相互基类中定义这个函数,参数 - 所以我改变了函数以取(void* input),然后在定义Scalar&amp;中的函数时尝试了以下内容。矢量类:

samplerType inputSampler = dynamic_cast&lt; samplerType&gt;(输入);

但是,我在VS 2005中收到以下错误:

error C2680: 'double (__cdecl *)(RandNum &)' : invalid target type for dynamic_cast
target type must be a pointer or reference to a defined class

Grumble Grumble Grumble ......我不确定这是否有效(标准许可)C ++与否,但无论如何我想我会把这视为我设计中的缺陷。

所以,我的标准方法是使用函数的返回类型来模板化基类,但我不能。基类Parameter必须 - 通过设计 - 没有所有类型信息。 有没有不同的方法来设计继承?

我对谷歌的尝试在函数指针上几乎为零 - 因此我相信这实际上是无效语法,但也许只是真的,真的不常见的设计挑战? 这是另一个地方,仿函数来救援吗?

1 个答案:

答案 0 :(得分:1)

除了James指出的设计缺陷之外,你无法从函数指针转换为普通的void*指针。但是,您可以在任意类型的函数指针之间进行转换(免费,成员到成员):

typedef void (*samplerType)();
// in base class ...
samplerType sampler_;
template<class F>
void RegisterSampler(F sampler){
  // template so the user doesn't have to do the type cast
  sampler_ = reinterpret_cast<samplerType>(sampler);
}
// in derived class, where you access the sampler, you need to cast it back:
// (scalar)
typedef double (*realSamplerType)(RandNum& rnState);
// made-up function ...
void UseSampler(){
  realSamplerType sampler = reinterpret_cast<realSamplerType>(sampler_);
  double ret = sampler(param...);
}