我有一个算法,从指针转换为类
std::vector<MyClass> input;
std::vector<MyClass*> ptrs;
std::vector<MyClass> output;
所以要获得ptrs
我做
transform(input.begin(), input.end(), back_inserter(ptrs), addressof<MyClass>);
标准库中是否存在相反操作,例如deref_of
,以便我可以得到以下结果:
transform(ptrs.begin(), ptrs.end(), back_inserter(output), deref_of<MyClass*>);
答案 0 :(得分:6)
标准库中没有这样的东西。
但是,您可以自己编写:
template<typename T>
T& deref(T * ptr) { return *ptr; } //non-const version
template<typename T>
T const & cderef(T const * ptr) { return *ptr; } //const version
您必须将其用作deref<MyClass>
,而不是deref<MyClass*>
。
在C ++ 14中,您可以使用通用lambda来简单地使用它:
auto deref = [](auto * ptr) { return *ptr; };
现在您只能使用deref
代替deref<MyClass>
(与前一种情况相同)。无论如何,类型将由编译器推断。当然,您可以在C ++ 11(甚至在C ++ 03中)实现它:
static const struct deref_t //static const applies to the object
{
template<typename T>
T& operator()(T const * ptr) const { return *ptr; }
}deref; //declare an object as well.
将其用作deref
。它就像普通的lambda。
希望有所帮助。
答案 1 :(得分:6)
您可以使用boost::indirect_iterator
执行此操作。
std::copy(boost::make_indirect_iterator(ptrs.begin()),
boost::make_indirect_iterator(ptrs.end()),
std::back_inserter(output));