スマート ポインターを使用するように以下のコードを変更しました。
テンプレートクラスがあります:
class IRequest;
template<class T>
class Request : public IRequest
{
public:
Request(T in) : m_data(in) {}
virtual ~Request() {}
T get() { return m_data; }
void set(T in) { m_data = in; }
private:
T m_data;
}
別のクラスには、次のメソッドがあります。
template<T>
void invoke(Request<T>& request)
{
// Do some stuff
}
std::unique_ptr<IRequest> getRequest(int which)
{
switch(which)
{
case 1: return std::unique_ptr<IRequest>(new Request<int>(1));
case 2: return std::unique_ptr<IRequest>(new Request<bool>(true));
case 3: return std::unique_ptr<IRequest>(new Request<double>(2.0));
default: throw std::exception();
}
}
void run()
{
int type = getRequestType();
std::unique_ptr<IRequest> request = getRequest(type);
invoke(*request);
}
問題は、run() メソッドをテンプレート化できないことです。1 つまたはそれらのみが必要であり、getRequestType() がファイルから値を読み取っているため、受信したあらゆるタイプの要求を処理できる必要があります。任意のタイプを含めることができます。
コンパイラはこれを好みません。run() メソッドと invoke() の呼び出しの両方で、Request が角かっこで囲まれた型を持つことを期待しています。また、getRequest() の戻り値の型に山かっこがあることも想定しています。
任意の型のテンプレート オブジェクトを保持して渡すための C++ メカニズムはありますか?
呼び出しをそのままにするか、次のように変更する必要があります。
void invoke<IRequest& request)