下面的代码更改为使用智能指针:
我有一个模板类:
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() 正在从文件中读取值,可以包含任何类型。
编译器不喜欢这样,它希望 Request 在 run() 方法和对 invoke() 的调用中都具有尖括号中的类型。它还期望 getRequest() 的返回类型具有尖括号。
是否有用于保存和传递任何类型的模板对象的 C++ 机制?
如果调用保持原样,或者应该更改为:
void invoke<IRequest& request)