J'apprends le C++ et je sais à peu près ce que je veux faire, mais je le fais de travers et je suis très fatigué. Quelle est la meilleure façon (la manière correcte d'abord) de faire quelque chose comme ceci:Comment corriger et améliorer ce code C++ en utilisant les templates et l'héritage?
// Query.hpp
class Query {
public:
Query();
template<typename T>
std::vector<boost::shared_ptr<BaseResult> > run();
private:
std::string sql;
};
// Firstly, something like this:
// I would like to do the equivalent of passing in a type T that would be
// derived from BaseResult and create a new instance of it when adding
// to vector of BaseResult:
template<typename T>
std::vector<boost::shared_ptr<BaseResult> > Query::run() {
std::vector<boost::shared_ptr<BaseResult> > results;
// 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()) {
results.push_back(new T(res));
}
// RVO prevents copy in release - yes?
return results;
}
// Query.cpp
Query::Query() {
}
// main.cpp
void foo(const std::vector<boost::shared_ptr<BaseResult> >& results) {
// loop through calling virtual method on each item
}
int main(int argc, char* argv[])
// Determine query type
ProgramOptions opts(argc, argv);
// Should this indeed be a pointer because
// of code below or is it wrong?
std::vector<boost::shared_ptr<BaseResult> >* results;
// Secondly, something like this:
if (opts.getquerytype() == "type1") {
// I'd like to get a
// std::vector<boost::shared_ptr<BaseResult> > returned here
// containing many instances of a
// type derived from BaseResult
// I'd like to be able to do something like this
// Is this assignment correct?
*results = getQuery().run<DerivedResult>();
}
else {
// I'd like to get a
// std::vector<boost::shared_ptr<BaseResult> > returned here
// containing many instances of a
// different type derived from BaseResult
// I'd like to be able to do something like this
// Is this assignment correct?
*results = getQuery().run<DifferentDerivedResult>();
}
foo(results);
}