2011-04-02 42 views
0

我有一個基類,Parameter和兩個派生類:標量& Vector。在每個派生類,我有一個成員函數,它接受一個函數指針作爲輸入:所以我不能dynamic_cast <functionPointer>(((void *)(myFuncPtr)))?我該怎麼辦?

在標量類:

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)然後嘗試了定義的功能,當標量&矢量的類內下列:

samplerType inputSampler = dynamic_cast的< samplerType >(輸入);

不過,我得到以下錯誤在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 

嘰嘰嘰......我不知道這是否是有效的(標準允許)C++或沒有,但我想無論哪種方式我會把它當作我設計中的一個缺陷。

所以,我的標準方法是模板與函數的返回類型的基類,但我不能。基類Parameter必須 - 按設計 - 不含所有類型的信息。 有沒有不同的方式來設計繼承?

我對谷歌嘗試這個已經變成了幾乎爲零的函數指針 - 因此我認爲,這是事實上無效的語法,但也許只是一個真的,真的少見的設計挑戰? 這是另一個地方,仿函數來拯救?

+0

我不明白的理由:你爲什麼要這樣無類型'Parameter'成員是在基類中?由於其類型未知,因此無法使用它。函數對象不能幫助你(除非你做了一些醜陋的事情,比如聲明它返回一個'boost :: any'),因爲返回類型對函數對象的類型來說是必不可少的。 – 2011-04-02 00:16:17

+0

我不希望它在基類中,但我想從基類指針訪問註冊函數。換句話說,我有一個Parameter *數組,我想註冊一個函數,我知道它有給定參數*的正確簽名。 – 2011-04-02 00:20:37

+0

爲了什麼目的?你不能使用它,除非你知道它的實際類型,從你所說的依賴於派生類的實際類型,對吧? – 2011-04-02 00:22:20

回答

1

除了詹姆斯指出的設計缺陷之外,你不能從一個函數指針指向正常的指針void*。您可以arbitary類型的函數指針之間。然而投(自由到自由,成員對成員):

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...); 
} 
+0

我剛剛試過這個,得到: 錯誤C2440:'static_cast':無法從'Matrix <>(__cdecl *)(RandNum&)'轉換爲'void(__cdecl *)(RandNum&)' 不兼容的調用約定對於UDT返回值' – 2011-04-02 00:41:55

+0

@M。 Tibbits:讓我檢查一下。 – Xeo 2011-04-02 00:42:45

+0

你說的話看起來很合理,我剛剛找到[此鏈接](http://learningcppisfun.blogspot.com/2005/07/casting-cv-qualifier-and-function.html),有趣的閱讀與你同意 - 儘管你失去了類型安全......類型安全?什麼類型安全? – 2011-04-02 00:46:52