NULL値を持つことができるいくつかの関数ポインタをラップする必要があります。私は関数ポインタがNULLかどうかをチェックし、ポインタがNULLでない場合は元の関数を呼び出し、ポインタがNULLの場合はデフォルト値を返す汎用クラステンプレートを作成しようとしています。このような何か:NULLチェックを含む汎用C++関数ポインタラッパーを作成できますか?
見ることができるように//Function typedefs
typedef void(*foo)();
typedef int(*bar)(int u, char *);
//Function pointers
foo gfFoo;
bar gfBar;
//Wrapper class
template<typename T, typename... Args>
class WrapFuncObj {
T* f;
public:
WrapFuncObj(T* t) {
f = t;
}
typename std::result_of<T(Args...)>::type operator()(Args&&... args) {
if(f != nullptr){
return (*f)(std::forward<Args>(args)...);
}
else
{
return 0; //RETURN something for non-void types
}
}
};
template<typename T, typename... Args>
class WrapFuncObjVoid {
T* f;
public:
WrapFuncObjVoid(T* t) {
f = t;
}
typename std::result_of<T(Args...)>::type operator()(Args&&... args) {
if(f != nullptr){
(*f)(std::forward<Args>(args)...);
}
else
{
//DO Nothing for void
}
}
};
//Usage:
WrapFuncObjVoid<foo> WrapFoo(&gfFoo);
WrapFoo();
WrapFuncObj<bar, int, char*> WrapBar(&gfBar);
WrapBar(0, "test");
、関数ポインタがNULLの場合はnullの場合には、何も返されるべきではないので、非ボイドと、ボイドタイプに別々のテンプレートが必要です。どのようにこの問題を回避し、両方のために十分な1つのテンプレートを作る?
どこかで 'void 'の戻り値型を特殊化することを避ける方法はありません。 –
@SamVarshavchik:そうです。 [C++ではvoidを返すことができます(http://stackoverflow.com/questions/3383090/is-returning-void-valid-code)。 – Cornstalks
もしそれらがコンストラクタにnullを渡すのであれば、ポインタをデフォルトの関数に設定しないのはなぜですか? –