基本的に、コンストラクターの外部で変数を設定し、クラス全体からアクセスできるようにする必要があります。
次のように動作する必要があります。
#include <iostream>
#include <string>
template <typename MT>
class CallbackFunction
{
void (*func)(MT);
MT *data;
public:
void SetCallbackData (void (*f)(MT), MT *d)
{
func = f;
data = d;
}
void Call()
{
func(data);
}
};
class Callback
{
public:
template <typename T>
void SetCallback(CallbackFunction <T> *func)
{
// Need to make this a class member;
CallbackFunction <T> *CallbackClass = func;
}
void Call()
{
CallbackClass->Call();
}
};
template <typename CT>
Callback *NewCallback(void (*func)(CT), CT *data)
{
Callback *cb;
CallbackFunction <CT> *cf;
cf->SetCallbackData(func, data);
cb->SetCallback <CT> (cf);
return cb;
};
void Call(Callback *CallbackFunc)
{
CallbackFunc->Call();
}
void foo(std::string str)
{
std::cout << str << "\n";
}
int main()
{
std::string *str;
str->append("Hello, World!");
Call( NewCallback(foo, str) );
return 0;
}
詳細:
バグがあり、コンパイルできないことはわかっています。問題の解決策が見つかったら、それらのバグを整理します。それは次のとおりです。
クラス「Callback」のメンバー関数内でテンプレート変数を宣言する方法を見つける必要があります。クラス「Callback」はテンプレートにすることができず、単純なクラスのままにする必要があるため、これを行う必要があります。クラス「Callback」はテンプレートではないため、代わりにそのメンバー関数の 1 つをテンプレートにする必要があります。そのため、メンバー関数は、関数が呼び出されたときに (テンプレートで) 定義された型の変数を宣言でき、この変数はクラス全体からアクセスできる必要があります。
素敵なリストで:
- クラス "Callback" をテンプレートにすることはできません。
- 変数 CallbackClass は、クラス全体からアクセスできる必要がありますが、クラス内にとどまります。