为Eigen和std::vector编写模板函数
Writing templated functions for Eigen and std::vectors
我希望写一个模板函数来接受Eigen::VectorX* (float/int/double)和std::vector<*> (float/int/double)和"simple" int/float/double。
如何声明模板?下面的方法行不通。
// header.h
//std::vector function
template <typename T, typename A>
void do_something(std::vector<T, A> &stdvec)
{
//do stuff with std::vector<T>
//e.g. std::fill(stdvec.begin(),stdvec.end(),0);
}
//Eigen vector function
template <typename Derived>
void do_something(Eigen::EigenBase<Derived> &evec)
{
//do stuff with Eigen::VectorX
//e.g. evec.setZero()
}
//single value function
template <typename T>
void do_something(T &var)
{
//do stuff with int/float/double
//e.g. var = 0;
}
基本原理是不要为所有不同的组合编写单独的函数
您可以使用std::enable_if
仅为算术类型启用完全泛型版本:
template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value,void>::type
do_something(T &var) { ... }
Eigen::VectorX*
仅继承Eigen::EigenBase<Derived>
,因此c++将优先使用do_something(T &var)
方法。您可以将函数的特征变体声明为:
template<typename Scalar>
void do_something(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &evec) { /*...*/}
技巧不是编写几个函数(正如您所发现的),而是根据容器不同地应用标量函数(void do_something(T &var)
):
标量:
do_something(var);
std::vector
std::transform(v.begin(), v.end(), v.begin(), do_something);
特征
matrix.unaryExpr(do_something);
相关文章:
- 编译器如何区分std::vector的构造函数
- 为什么std::vector和std::valarray初始化构造函数不同
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- std::vector 没有重载函数的实例与参数列表匹配
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 为 std::vector 编写自定义插入函数
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 将 cv::Mat 转换为 std::vector 的通用函数
- 从 std::vector 迭代器中执行函数指针
- C++ std::vector 中的虚拟析构函数继承
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- push_back std::vector,则重复调用复制构造函数
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 双重调用传递给 std::vector::emplace_back 的类的复制构造函数