我有一个算法,从指针转换为类
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)
标准库中不存在这样的东西.
但是,您可以自己编写:
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.
希望有所帮助.
你可以使用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)
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |