Как указать аргумент шаблона для функции у ребенка?

Итак, я стараюсь:

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>>, Как это сделать?

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

Другие решения

По вашему описанию. Вы хотите новую функцию с другой подписью. Таким образом, вы будете обрабатывать эти getdata в дочернем классе, как если бы его функция была совершенно другой, поскольку тип возвращаемого значения отличается.

1

Шаблоны функций-членов (например, ваши 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());
}
};
0
По вопросам рекламы [email protected]