會員功能模板(如你的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()
爲T
等於std::vector<int>
,你只需要專門data_ppp
template <>
class data_ppp< std::vector<int> > {
typedef std::vector<int> T;
public:
virtual boost::shared_ptr<T> getData()
{
// add logging, printing or whatever you want
return boost::shared_ptr<T>(new T());
}
};
成員函數模板不能是虛擬的:http://stackoverflow.com/questions/2354210/can-a-member-function-template-be-virtual –
你能用C++ 11編譯嗎? – 0x499602D2