C++ 将指针向量转换为对象向量

C++ 将指针向量转换为对象向量,c++,c++11,vector,C++,C++11,Vector,我有这个向量: std::vector<T*> foo; std::vector foo; 我有一个具有以下签名的函数(我无法更改): void条(std::vector const&); 我如何将foo传递给该函数,并进行最小的更改 我目前的做法是: std::vector<T> another_bar(bar.size()); std::transform(std::begin(bar),std::end(bar),std::begin(another_bar)

我有这个向量:

std::vector<T*> foo;
std::vector foo;
我有一个具有以下签名的函数(我无法更改):

void条(std::vector const&);
我如何将foo传递给该函数,并进行最小的更改

我目前的做法是:

std::vector<T> another_bar(bar.size());
std::transform(std::begin(bar),std::end(bar),std::begin(another_bar),[](T* item){return *T;});
std::vector另一个_条(bar.size());
std::transform(std::begin(bar)、std::end(bar)、std::begin(另一个_条),[](T*item){return*T;});
我认为这里有很多不必要的复制

编辑:


T不是模板参数。它是指定的类型

您的方法尽可能正确。你必须做大量的复制工作。另一个问题是,如果您有任何从T派生的类,它也会“切片”。有时您有两个不同的程序,这是不可避免的,但更可能的是您应该重新评估调用方或函数的设计

由于
T
是一种特定的给定类型,因此如果不修改
T
bar
,就无法避免复制

如果您可以将
T
设置为泛型,那么您可以创建一种“PIMPL包装器”:一个在内部包含指向真实
T
的指针的对象,并通过在内部调用相应函数来实现与
T
相同的接口


换句话说,您的转换代码看起来不错。

虽然您需要复制一些副本,但可以避免构造默认值,然后通过直接复制构造创建副本:

std::vector<T> another_bar;
another_bar.reserve(bar.size());
std::transform(std::begin(bar), std::end(bar),
               std::back_inserter(another_bar),[](T* item){return *item;});
std::vector另一个_条;
另一个_bar.reserve(bar.size());
标准::转换(标准::开始(条形),标准::结束(条形),
std::back_插入器(另一个_条),[](T*item){return*item;});

什么是
T
?特定类型或模板参数?有复制,但我认为没有必要。还有什么方法可以获得向量呢?为什么在第一个花边有原始指针向量?@Zulan:具体类型我想我知道@LogicStuff的目的是什么,如果向量包含指向基类的指针,那么切片会有很大的问题,你的基类可能违反了所谓的“三定律”.关于切片的通知很棒!但是,如果
T
是一个多态基类,那么
foo
签名就没有任何意义了。foo对于基类来说是合适的。是对bar的函数调用阻止了多态性。是的,这当然更好。。然而,我想的是完全更好的解决方案,但它似乎不存在。再次感谢
[](T*item){return*T;}
应更正为
[](T*item){return*item;}
对吗?@user3405291:当然,拼写错误已修复。
std::vector<T> another_bar;
another_bar.reserve(bar.size());
std::transform(std::begin(bar), std::end(bar),
               std::back_inserter(another_bar),[](T* item){return *item;});