为Eigen和std :: vectors编写模板化函数

时间:2016-10-13 18:47:51

标签: c++ eigen

我希望编写一个模板化函数来接受Eigen :: VectorX *(float / int / double)和std :: vector< *> (float / int / double)和"简单" INT /浮动/双。

我如何申报模板?以下不起作用。

// 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;
}

理由是不要将所有不同组合的单个函数写入。

3 个答案:

答案 0 :(得分:1)

您可以使用std::enable_if仅为算术类型启用完全通用版本:

template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value,void>::type
do_something(T &var) { ... }

答案 1 :(得分:0)

Eigen::VectorX*仅继承自Eigen::EigenBase<Derived>,因此C ++更喜欢do_something(T &var)方法。您可以将函数的Eigen变量声明为:

template<typename Scalar>
void do_something(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> &evec) { /*...*/}

答案 2 :(得分:0)

诀窍不是写几个函数(如你所发现的),而是根据容器不同地应用标量函数(void do_something(T &var)):

标量:

do_something(var);

std::vector

std::transform(v.begin(), v.end(), v.begin(), do_something);

Eigen

matrix.unaryExpr(do_something);