我對此有一個后續問題:
vector<unique_ptr<A> > 使用初始化串列
我想實作與參考問題基本相同的目標,但這次使用多型類。也就是說,我想創建一個std::vector<std::unique_ptr<Base>>使用初始化串列。
#include <vector>
#include <memory>
#include <iterator>
#include <iostream>
template<class T>
struct movable_il {
mutable T t;
operator T() const&& { return std::move(t); }
movable_il( T&& in ): t(std::move(in)) {}
};
template<class T, class A=std::allocator<T>>
std::vector<T,A> vector_from_il( std::initializer_list< movable_il<T> > il ) {
std::vector<T,A> r( std::make_move_iterator(il.begin()), std::make_move_iterator(il.end()) );
return r;
}
// Example with class hierarchy
class Base
{
public:
Base(int in) : x(in) {}
virtual ~Base() = default;
virtual void print() const = 0;
protected:
int x;
};
class Derived1 : public Base
{
public:
Derived1(int in) : Base(in) {}
virtual ~Derived1() = default;
virtual void print() const override { std::cout << "Derived1: " << x << std::endl; }
};
class Derived2 : public Base
{
public:
Derived2(int in) : Base(in) {}
virtual ~Derived2() = default;
virtual void print() const override { std::cout << "Derived2: " << x << std::endl; }
};
int main()
{
{
auto v = vector_from_il< std::unique_ptr<Base> >({
std::make_unique<Derived1>(7),
std::make_unique<Derived2>(3)
});
for (const auto & val : v)
val->print();
}
return 0;
}
編譯器(Ubuntu 18 上的 GCC 7.4.0)錯誤訊息是:
template argument deduction/substitution failed:
cannot convert '{std::make_unique(_Args&& ...)
[with _Tp = Derived1;
_Args = {int};
typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<Derived1, std::default_delete<Derived1> >](),
std::make_unique(_Args&& ...)
[with _Tp = Derived2;
_Args = {int};
typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<Derived2, std::default_delete<Derived2> >]()}'
(type '<brace-enclosed initializer list>') to type 'std::initializer_list<movable_il<std::unique_ptr<Base> > >'
我認為該錯誤與模板引數推導期間未考慮任何轉換的事實有關,因此也許這是不可能的。
uj5u.com熱心網友回復:
添加額外的建構式
template <typename U>
movable_il(U&& in): t(std::forward<U>(in)) {}
修復編譯。
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484067.html
