私はテンプレート化されたクラスのパラメータを持っています。 すべてのパラメータをコンテナに入れたいと思います。 私のパラメータが異なるタイプでインスタンス化されている場合、これを行う方法は?クラスContainerで C++では、異なるタイプのパラメータを持つ特殊なテンプレートオブジェクトのコンテナを使用できますか?
は、私が は可能ではないように思われるさまざまなタイプ(int型、ダブル、...)または同等のものからベクトル<パラメータ* >を持っていると思います。パラメータクラスが基本クラスから派生している場合、コンテナはvectをベクトル< Base * >として宣言できます。しかし、この場合は、Container :: fooに特有なことは何もできません。
以下は私のソースの例です。私のパラメータの1つはostreamと互換性のないQStringです。
ご意見ありがとうございます。
#include <QString>
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
#define P(a) cout << #a << ":" << a << endl
/*
class Base {
};
*/
template<typename T> class Parameter /*: public Base */ {
private:
T val;
public:
void setVal(const T &val) {
this->val = val;
}
const T &getVal() {
return val;
}
string getFoo() {
stringstream s;
s << val;
return s.str();
}
};
template<>
string Parameter<QString>::getFoo() {
stringstream s;
s << val.toStdString();
return s.str();
}
class Container {
public:
void push_back(Parameter *base) {
vect.push_back(base);
}
void foo() {
/* do something with the parameters */
}
private:
vector<Parameter*> vect;
};
int main() {
Parameter<int> pi;
Parameter<QString> ps;
pi.setVal(10);
ps.setVal("QString");
P(pi.getVal());
P(ps.getVal().toStdString());
P(pi.getFoo());
P(ps.getFoo());
Container container;
container.push_back(&pi);
container.push_back(&ps);
}
コメントいただきありがとうございます。私はあなたの助言に従い、boost :: anyを使用します。
#include <boost/any.hpp>
#include <QString>
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
#define P(a) cout << #a << ":" << a << endl
template<typename T> class Parameter {
private:
T val;
public:
void setVal(const T &val) {
this->val = val;
}
const T &getVal() {
return val;
}
string getFoo() {
stringstream s;
s << val;
return s.str();
}
};
template<>
string Parameter<QString>::getFoo() {
stringstream s;
s << val.toStdString();
return s.str();
}
class Container {
public:
void push_back(boost::any base) {
vect.push_back(base);
}
void foo() {
cout << "do something with the parameters\n";
for (vector<boost::any>::iterator i = vect.begin(); i != vect.end(); ++i) {
boost::any a = (*i);
if (a.type() == typeid(Parameter<int>*)) {
Parameter<int> *ai = boost::any_cast<Parameter<int> *>(a);
cout << ai->getFoo() << endl;
} else if (a.type() == typeid(Parameter<QString>*)) {
Parameter<QString> *aq = boost::any_cast<Parameter<QString> *>(a);
cout << aq->getFoo() << endl;
} else {
cout << "unknown type:" << a.type().name() << endl;
}
}
}
private:
vector<boost::any> vect;
};
int main() {
Parameter<int> pi;
Parameter<QString> ps;
pi.setVal(10);
ps.setVal("QString");
P(pi.getVal());
P(ps.getVal().toStdString());
P(pi.getFoo());
P(ps.getFoo());
Container container;
container.push_back(&pi);
container.push_back(&ps);
container.foo();
}
Qstringは "ostreamと互換性がありません"とはどういう意味ですか?この問題はどのように関連していますか?パラメータ :: getFoo()を呼び出そうとしていますか?意味のある場合には、演算子をQstringで動作させるためのメソッドを提供することができます。 –
bacar
まさにあなたは何をしようとしていますか?ベースを使って問題を解決できないのはどうですか?タイプに固有のいくつかの機能(「Container :: fooで特定のことは何もできません」)を持っている間に、複数のタイプに共通するものがほしいと思うように思えます。 – bacar
@bacarテンプレートクラスのgetFoo()はQStringでは機能しません。 ■< < val.toStdString()を使用する必要があります。
– user1132852