使用向量而不是双精度作为输入时的模板

时间:2012-07-10 12:17:47

标签: c++ templates casting operator-overloading

我正在尝试使用C ++模板实现一个非常简单的事情。我想构建一个可以处理sgn(x)案例的通用符号函数,其中x可以是doublestd::vector<double>(即返回包含结果的std::vector<double>)。为了实现我使用模板

double f(double x) {
    return (x>=0)?1.0:-1.0;
};

template<typename T>
T F(T x) {
   // ?
};

我想投射模板,如果f使用double,或for使用std::vector<double>循环。不幸的是,我的函数不使用任何算术运算符,并且条件运算符不能重载。我该怎么办?

2 个答案:

答案 0 :(得分:3)

这可以通过重载来解决,而不是模板。

double sign(double x) {
    return x < 0.0 ? -1.0 :
           x > 0.0 ?  1.0 : 0.0;
};

std::vector<double> sign(std::vector<double> const& x) {
    // ?
};

那就是说,我怀疑sign函数对于向量是否有意义。

顺便说一下,这与“算术”与“非算术”功能无关,正如问题标题所述。这种区别在C ++中不存在。

答案 1 :(得分:3)

虽然重载是实现您想要的最佳方式,但事实并非如此 真的是使用C ++标准库的方式。

如果要将函数应用于容器的所有元素(或者 改变它们或创建新结果),使用std::transformstd::for_each具有您要使用的功能。

std::vector<double> doubles, results;
std::transform(begin(doubles), end(doubles), std::back_inserter(results), sgn);

这使人们的担忧远远超过你目前的做法。只要 如果真的需要,则在整个集装箱上运行 case使用迭代器和高阶函数。