是否有标准的库函数,与addressof相反?

时间:2014-05-14 07:13:15

标签: c++

我有一个算法,从指针转换为类

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*>);

2 个答案:

答案 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));

Live demo