如何将派生类型的容器转换为基类型的容器

时间:2012-08-14 14:30:26

标签: c++ templates constructor type-conversion

我有一个C ++ 03应用程序,其中包含一个类的单个实例,我试图在派生类型的持有者之间转换为基类型的持有者。例如:

class B { public: virtual ~B() { }; };

class A : public B { };

template< typename T >
class Container
{
public:
    explicit Container( T* obj ) : obj_( obj ) { };
    Container( const Container< T >& ref ) : obj_( ref.obj_ ) { };

    template< typename U > operator Container< U >() { 
        return Container< U >( obj_ );
    };

private:
    T* obj_;
};

这很好用:

int main()
{
    Container< A > a_ref( new A() );
    Container< B > b_ref = a_ref;
    return 0;
}

这给了我错误invalid initialization of reference of type ‘Container<B>&’ from expression of type ‘Container<A>’

void Foo( Container< B >& cb ) { }

int main()
{
    Container< A > a_ref( new A() );
    Foo( a_ref );
    return 0;
}

这给了我错误error: invalid initialization of non-const reference of type ‘Container<B>&’ from a temporary of type ‘Container<B>’ L

int main()
{
    Container< A > a_ref( new A() );
    Foo( static_cast< Container< B > >( a_ref ) );
    return 0;
}

如何将Container< A >类型传递给期望Container< B >类型的函数?我是否需要先复制该对象?

3 个答案:

答案 0 :(得分:2)

添加另一个构造函数:

template <typename U>
Container(Container<U> const & ref,
          typename std::enable_if<std::is_base_of<T, U>::value, int>::type = 0)
: obj_(ref.obj_)
{ }

我添加了enable_if部分,以确保当U类型实际派生自T时,此新构造函数模板仅参与重载解析。

答案 1 :(得分:1)

Container<A>Container<B>完全不同。

您可以使用container_cast<T>(U)之类的内容将Container<A>转换为Container<B>

container_cast将通过Container<T> obj_并将Container<U>转换为obj_

来构建另一个T*

答案 2 :(得分:-1)

不使用容器,而是使用迭代器对,它可以很好地转换为基类。它解决了这个问题,并一次性清理代码。


编辑:在给出更多信息后,我将答案改为:

使用boost::shared_ptr