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

Nik*_*iou 4 c++

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

std::vector<MyClass>  input;
std::vector<MyClass*> ptrs;
std::vector<MyClass>  output;
Run Code Online (Sandbox Code Playgroud)

所以要获得ptrs我的帮助

transform(input.begin(), input.end(), back_inserter(ptrs), addressof<MyClass>);
Run Code Online (Sandbox Code Playgroud)

标准库中是否存在相反的操作,deref_of以便我可以得到如下结果:

transform(ptrs.begin(), ptrs.end(), back_inserter(output), deref_of<MyClass*>);
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 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   
Run Code Online (Sandbox Code Playgroud)

你必须使用它deref<MyClass>,而不是deref<MyClass*>.


在C++ 14中,您可以使用通用lambda来简单地:

auto deref = [](auto * ptr) { return *ptr; };
Run Code Online (Sandbox Code Playgroud)

现在你可以使用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.
Run Code Online (Sandbox Code Playgroud)

用它作为deref.它就像普通的lambda.

希望有所帮助.


Pra*_*ian 6

你可以使用boost::indirect_iterator.

std::copy(boost::make_indirect_iterator(ptrs.begin()),
          boost::make_indirect_iterator(ptrs.end()),
          std::back_inserter(output));
Run Code Online (Sandbox Code Playgroud)

现场演示