は、これらの定義および説明の目的のために、これらの線に沿っていくつかのコードを考える:基本となる型を知らなくても、テンプレート化された親クラスから値を戻すにはどうすればよいですか?
class Child
{
private:
std::string name;
public:
Child(const std::string & name) name(name)
{ }
}
template<typename T>
class Parent : public Child
{
private:
T data;
public Parent(const std::string & name, const T & data) : Child(name), data(data)
{ }
inline GetData() const
{
return this->data;
}
}
std::vector<std::unique_ptr<Child>> values;
values.emplace_back(std::make_unique<Parent<int>>("value a", 4));
values.emplace_back(std::make_unique<Parent<std::string>>("value b", "test"));
for (const auto & v : values)
{
// I want to access the int and string here!
}
どのように私はここに、基本クラスから親クラスで使用されるタイプを決定するのでしょうか?
私が働いている具体的なシナリオでは、私はSQLのストアドプロシージャのパラメータとstd::vector<std::unique_ptr<SqlParameterBase>>
に含まれることになってと表すクラスに渡されSqlParameter<T>
テンプレートについての情報を含むSqlParameterBase
クラスの束を持っていることを、実際にありますストアドプロシージャの設定を呼び出すことができます。
しかし基本的な問題は、基になるデータにアクセスする必要があり、データへのポインタを格納するために基本クラスにvoid *
を定義することを避けたかったということです。私はそれが可能な限り型の安全であることを好むでしょう。
私はこの問題を解決するための代替設計やアプローチにもオープンしています。より良いと感じたら、全く別のものを提案してください。
あなたは本当に欲しいのはバリアント型です。 – juanchopanza
ええ、私は親の型への動的キャストを行う必要があることを知っています。つまり、すべてのタイプをハードコードされた方法でテストすることなく、どのタイプをキャストするかを判断することはできません。結局、私は基本的に、ベクトルの要素の数や文字列の長さなど、データのサイズを決めることができる必要があります。それらのメンバ関数は型に基づいて変更されます。私はテンプレートについて考えて、T :: sizeが存在すると仮定しただけですが、関数の動作が型間で異なって定義されていると危険です。 –
データの「サイズ」を決定する必要がある場合、 'virtual std :: size_t size()const = 0;'を 'Child'に追加する方法はありますか? – aschepler