Итак, я стараюсь:
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>>
, Как это сделать?
Единственное решение вашей проблемы, которое я вижу сейчас:
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
По вашему описанию. Вы хотите новую функцию с другой подписью. Таким образом, вы будете обрабатывать эти getdata в дочернем классе, как если бы его функция была совершенно другой, поскольку тип возвращаемого значения отличается.
Шаблоны функций-членов (например, ваши 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());
}
};