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

Is there a standard library function, opposite from addressof?

本文关键字:addressof 相反 库函数 有一个 标准 是否      更新时间:2023-10-16

我有一个从指针转换到类的算法

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

您可以使用boost::indirect_iterator

std::copy(boost::make_indirect_iterator(ptrs.begin()),
          boost::make_indirect_iterator(ptrs.end()),
          std::back_inserter(output));

现场演示

标准库中不存在这样的东西。

但是,你可以自己写:

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。

希望对你有帮助。