特征分配器给模板类带来麻烦
Eigen Allocator causing Trouble in Templated Class
我有这个类:
typedef vector<Eigen::Affine3d,Eigen::aligned_allocator<Eigen::Affine3d> > VoteList;
template <class T>
class KernelDensityEstimator {
public:
KernelDensityEstimator() {}
void setData(vector<T>& d) {
data = d;
}
void setKernel(double (*k)(T&, T&)) {
kernel = k;
}
double evaluate(T& p) {
double sum;
for (int i = 0; i < data.size(); i++) {
sum += (*kernel)(p, data[i]);
}
return sum/data.size();
}
private:
double (*kernel) (T&, T&);
vector<T> data;
};
我现在想与类型T=Eigen::Affine3d一起使用。然而,当我调用setData()
时,它给我带来了麻烦,因为Eigen需要为std容器指定一个Eigen::aligend_allocater来与Eigen一起使用。
因此,当我将vector<Eigen::Affine3d,Eigen::aligned_allocator<Eigen::Affine3d> >
(也称为VoteList
)作为setData()
的输入参数时,我的编译器抱怨道:
no known conversion for argument 1 from ‘VoteList {aka std::vector<Eigen::Transform<double, 3, 2>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2> > >}’ to ‘std::vector<Eigen::Transform<double, 3, 2>, std::allocator<Eigen::Transform<double, 3, 2> > >&’
这是有道理的,但我认为分配器是对象类型的一部分。有没有办法绕过这一点并保持我的KernelDensityEstimator
通用性?
您可以为计划使用的类型启用Eigen的std::vector专业化,如图所示,例如:
#include<Eigen/StdVector>
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Affine3d)
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Matrix4d)
...
您基本上希望根据类模板参数类型T
为成员data
提供不同的类型。有几种方法可以做到这一点,这里有一个建议:
-
为类定义一种特殊的存储类型,在其中保存数据(最好将其放在合适的命名空间中或类内):
//normal storage type template<typename T> struct storage_type_impl { using type = std::vector<T>; }; //storage type for Eigen::Transform types template<typename ... Args> struct storage_type_impl<Eigen::Transform<Args ...> > { using type = std::vector<Eigen::Transform<Args ...> , Eigen::aligned_allocator<Eigen::Transform<Args ...> > >; }; template<typename T> using storage_type = typename storage_type_impl<T>::type;
-
现在,您可以在类中使用它,再加上模板化的
setData
方法(这就足够了,因为如果编译器无法执行数据复制/移动,它仍然会抱怨):template <class T> struct KernelDensityEstimator { template<typename D> auto setData(D&& d) { data = std::forward<D>(d); //calls move assignment if d is an rvalue //otherwise a copy is performed } //... private: storage_type<T> data; //... };
该代码未经测试,因为我目前没有可用的Eigen,但我希望它仍然能够解释基本思想。
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 将 std::allocate_shared 与多态资源分配器一起使用
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 查找奇数平方和时遇到麻烦
- 使用 std::分配器在 constexpr 中进行默认初始化
- 使用不兼容的分配器复制分配无序列图
- C++:矢量分配器行为、内存分配和智能指针
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 使用模板化分配器和对向量进行排序的函数
- C++ 中的分配器错误
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 通过引用传递向量是请求 std::分配器
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- C++自定义分配器大小参数作为模板参数会引发编译器错误
- 在分配器中销毁元素时,C++会导致双重释放<string>?
- 将双倍转换为 LPARAM 的麻烦
- 特征分配器给模板类带来麻烦