Во-первых, ваше назначение неверно
*results = getQuery().run<DifferentDerivedResult>();
Отменяет ссылку на неинициализированный указатель!
Я бы внес несколько изменений в ваш код, во-первых, при необходимости использовать vector<...>
везде будет вызывать RSI, typedef
это
class Query {
public:
// Query::ResultType
typedef std::vector<boost::shared_ptr<BaseResult> > ResultType;
Query();
// next, pass in the vector where the results will be stored...
template<typename T>
void run(ResultType& records);
private:
std::string sql;
};
Теперь реализация:
template<typename T>
void Query::run(ResultType& records) {
// ResultSet is from the mysql c++ connector
boost::shared_ptr<sql::ResultSet> res(stmt->executeQuery(this->sql));
// I want to add a new T to results here
while (res->next()) {
records.push_back(new T(res));
}
// No need to worry about RVO
}
Теперь в вашей главной:
Query::ResultType results; // not a pointer!
ТогдаВы можете вызывать каждый тип, например,
getQuery().run<DifferentDerivedResult>(results);
Это вносит минимальные изменения в ваш дизайн, если вы хотите полностью избежать типа BaseResult
, вы можете шаблонировать все - но я не уверен, какие функции BaseResult
дает вам и будет ли это возможно ..