我基本上希望生成一個通用C函數的包裝,而不必手動指定類型。所以我有一個固定的原型回調,但我需要在封裝基於包裝函數的類型做一些特殊的代碼...所以基本上我想在類模板中使用靜態方法包我的功能,以符合標準的接口,例如:非模板參數...這是一個模板! (C++)
// this is what we want the wrapped function to look like
typedef void (*callback)(int);
void foobar(float x); // wrappee
// doesn't compile
template< T (*f)(S) > // non-type template param, it's a function ptr
struct Wrapper
{
static void wrapped(int x)
{
// do a bunch of other stuff here
f(static_cast<S>(x)); // call wrapped function, ignore result
}
}
然後我想這樣做:
AddCallback(Wrapper<foobar>::wrapped);
然而,問題是,我不能只是繼續和使用在Wrapper模板中的函數參數中有一個「S」,我必須首先列出它作爲參數:
template< class T, class S, T (*f)(S) >
struct Wrapper
// ...
但是這意味着使用(Wrapper<void,float,foobar>::wrapped
)會更痛苦,理想情況下我只想傳遞函數指針,並自動計算出參數的類型(以及返回類型)。要清楚,在包裝函數中,我需要引用函數指針的類型(所以我確實需要一些等價的S或T)。
有沒有辦法做到這一點?
@damndirtyape:我想過你的問題,我想我已經做了類似的事情。不幸的是它涉及很多代碼。基本上,我的解決方案有一個重載operator()的基類,我有工廠函數,它構造了基於傳遞的函數類型的基類。如果你喜歡,我可以在某處貼上代碼。 – 2009-07-15 19:28:23