私はポインタのカスタムベクトルmy_ptr_vector
を実装しています。コンテナを共変させる
私はクラスBase
とDerived
から導き出したBase
です。
my_ptr_vector<Base>
とmy_ptr_vector<Derived>
の両方で(const参照によって)動作する必要があるメソッドがあります。それはもちろん、Base
クラスの要素メソッドを呼び出すだけです。
ただし、my_ptr_vector<Derived>
をmy_ptr_vector<Base>
に変換する方法はありません。
最小限の例の問題を再現:
#include <vector>
#include <memory>
class Base {};
class Derived : public Base {};
template<typename Element>
class my_ptr_vector : public std::vector< std::unique_ptr<Element> > {};
void funct(const my_ptr_vector<Base>& vect) {}
int main()
{
my_ptr_vector<Derived> vect;
funct(vect);
}
エラー:私はU
で、私はmy_ptr_vector<U>
からコンストラクタと代入演算子を提供した場合にそれを動作させることができhereを発見した
no suitable user-defined conversion from "my_ptr_vector<Derived>" to "const my_ptr_vector<Base>" exists
一般的なので、U*
はT*
に変換できます。例では、私はこれにクラスを変更した場合
は確かに、それはそれははそれが心配べきではないということだけヒントはありません-itコンストラクタでprint
ステートメントを実行しない、しかし
template<typename Element>
class my_ptr_vector : public std::vector< std::shared_ptr<Element> > {
public:
my_ptr_vector() {}
///copy constructor from vector of pointers to generic U
template<typename DerivedElement>
my_ptr_vector(const my_ptr_vector<DerivedElement>& oth)
{
printf("Oh, noes!"); //we don't want this method executed!
resize(oth.size());
for (std::shared_ptr<Element> ptr : oth)
{
push_back(ptr);
}
}
};
作品;それは実際に変換を実行しています!
これを回避する手段はありますか?
別の可能な解決策はfunc
は、テンプレート作成することはもちろんです:
template<typename T>
void funct(const my_ptr_vector<T>& vect) {}
しかし、私はfunc
内という情報が失われ、このように、vect
の要素は常にタイプBase
のです。
コード([mcve])を表示する方が簡単です。私の最初の考えは、 'my_ptr_vector 'を使用することです。これは、いくつかのクラスが導出される可能性のあるクラスのベクトルを処理する通常の方法です。 –
あなたは[std :: unique_ptr](http://en.cppreference。)の古い[std :: vector](http://en.cppreference.com/w/cpp/container/vector)を探しているかもしれません。 com/w/cpp/memory/unique_ptr)または[std :: shared_ptr](http://en.cppreference.com/w/cpp/memory/shared_ptr)? –
@TopologicalSortあなたは正しいです: –