我希望编写一个模板化函数来接受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;
}
理由是不要将所有不同组合的单个函数写入。
答案 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);
matrix.unaryExpr(do_something);