所以我试试:
class data_ppp {
public:
template <class T>
virtual boost::shared_ptr<T> getData()
{
return boost::shared_ptr<T>(new T());
}
};
class data_child : public data_ppp {
public:
template<>
getData<std::vector<int>>();
};
但是无法获得理想的效果 - 我希望在类data_child getData函数中只返回boost::shared_ptr<std::vector<int>>
。怎么做这个?
答案 0 :(得分:1)
我现在看到的问题的唯一解决方案是:
class data_ppp
{
public:
template<class T>
std::shared_ptr<T> getData()
{ return std::shared_ptr<T>(new T()); }
};
class data_child : public data_ppp
{
public:
std::shared_ptr<int> getData()
{ return data_ppp::getData<int>(); }
};
用法:
data_child dc;
dc.getData();
//dc.getData<float>(); // compilation error
答案 1 :(得分:1)
根据你的描述。您想要具有不同签名的新功能。因此,您将在子类中处理此getdata,就好像它的函数非常不同,因为返回类型不同。
答案 2 :(得分:0)
会员功能模板(例如您的getData()
)不能是虚拟的。但是,您可以使用具有虚拟成员函数的类模板:
template <class T>
class data_ppp {
public:
virtual boost::shared_ptr<T> getData()
{
return boost::shared_ptr<T>(new T());
}
};
这可以进行大量的自定义。
1)您可以定义一个班级data_ppp< std::vector<int> >
。如果该类需要表现为通用T
,那么就完成了。
2)如果要覆盖特定数据使用的行为,但对于所有类型T
,并且您希望动态使用新功能,则可以从data_ppp<T>
派生
template <class T>
class data_child: public data_ppp<T> {
public:
virtual boost::shared_ptr<T> getData()
{
// add logging, printing or whatever you want
return boost::shared_ptr<T>(new T());
}
};
3)如果您只想重新定义getData()
的{{1}}等于T
,则只需要专门化std::vector<int>
data_ppp