是否有一个标准的库函数,与addressof相反
Is there a standard library function, opposite from addressof?
我有一个从指针转换到类的算法
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。
希望对你有帮助。
相关文章:
- 如何在C++中递归地按相反顺序打印集合
- 重载更少,则运算符返回相反的布尔值
- 与朋友声明相反
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 以相反的顺序打印数组 - 为什么这在C++中是错误的?
- 如何使用 OpenMP 使线程以相反的顺序写入其数字?
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- C++位移位在相反方向上具有相同的常量,结果不同,代码更改很小
- 将具有相反操作数的两个函数重构为一个
- 有人可以解释我这个代码吗?它给出与我们输入的数字相反
- 按相反顺序插入矢量
- C++使用相反的顺序打印带有逗号的列表
- 以相反的顺序显示内容
- 在 C++98/03 中以相反的顺序将 C 数组附加到向量,而无需 for 循环
- 使用 std::addressof 时出现 GCC 7 编译错误
- 在 C++ 中,以相反顺序排序的最快方法是什么?
- 对象指针打印结果以相反的顺序进行
- 无法将加密文本从 C# 传递到C++和相反的文本
- C++ 以相反的顺序输出文本文件
- 是否有一个标准的库函数,与addressof相反