2012-07-10 52 views
1

我想用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如果doublefor循环,如果std::vector<double>。不幸的是我的函数不使用任何算术运算符,并且条件运算符不能被重载。我应该如何继续?

+0

为什么在这里使用模板?你应该重载这个函数。 – 2012-07-10 12:18:42

回答

3

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

如果你想给一个函数应用到一个容器(无论是 变异他们或创建新的结果)的所有元素,使用std::transformstd::for_each与您要使用的功能。

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

这个问题比目前的方法更好地分离。如果真的需要,只有 在整个容器上操作,而在所有其他 个案中使用迭代器和高阶函数。

+0

谢谢,我不会在这里重新发明轮子。对矢量应用函数是我所需要的,模板对此目的是无用的。 – vanna 2012-07-10 12:49:20

+0

@vanna好吧,'transform'等人**都是**模板。他们是完美的目的。 – pmr 2012-07-10 13:07:14

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++中不存在。

+0

感谢您在符号函数中注意到我的错误。正如我指出的那样,我不需要任何模板,重载将会很好。刚刚在这里感到困惑。 – vanna 2012-07-10 12:51:16