0
私はC++を学んでいて、やりたいことを大雑把に知っていますが、私はそれを間違ったやり方でやっています。とても疲れています。最善の方法は、このような何かをやっての(最初のすべての正しい方法)何:まずテンプレートと継承を使用してこのC++コードを修正し、改善する方法は?
// 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);
}