我正在尝试为构建在地图之上的类编写迭代器适配器。尝试从迭代器类型获取映射类型时遇到问题。基本上我想得到:
这是一个最小的再现。
#include <map>
#include <type_traits>
template <typename BaseIteratorT>
using ValueType = typename BaseIteratorT::value_type::second_type;
// Passes
static_assert(
std::is_same<ValueType<std::map<double, int>::iterator>, int>::value,
"bad type for mutable iterator");
// Fails
static_assert(
std::is_same<ValueType<std::map<double, int>::const_iterator>, const int>::value,
"bad type for const iterator");
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点(C++14)?
我正在处理点云数据(每个云 150k 点)。我想,对于每个 (x,y) 点,计算到参考点 O 的距离和方位角:
for each point p in points
dx = p.x - ox
dy = p.y - oy
d = hypot(dx, dy)
az = atan2(dy, dx)
Run Code Online (Sandbox Code Playgroud)
我有一个手动的 SSE 实现。我希望使用特征使代码更清晰:
ArrayXf x(points.size()), y(points.size());
for(unsigned i=0; i<points.size(); ++i) {
x[i] = points[i].x;
y[i] = points[i].y;
}
const ArrayXf d = (dx.square() + dy.square()).sqrt();
// implement a polynomial approximation to atan (same as the SSE)
Run Code Online (Sandbox Code Playgroud)
然而,从我的计时实验来看,这似乎根本没有向量化,因为时间与基线实现相同。而且我知道 SSE2 已启用,因为我正在同一文件中编译一些 SSE2 代码。
但是,根据文档,Eigen 在支持时确实利用了 SSE2(以及 3.3 中的 AVX)。它仅用于向量和矩阵运算吗?
编辑:我研究了生成的汇编代码,它确实包含一些 SSE …