我正在尝试使用C ++模板实现一个非常简单的事情。我想构建一个可以处理sgn(x)
案例的通用符号函数,其中x可以是double
或std::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>
循环。不幸的是,我的函数不使用任何算术运算符,并且条件运算符不能重载。我该怎么办?
答案 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
函数对于向量是否有意义。
答案 1 :(得分:3)
虽然重载是实现您想要的最佳方式,但事实并非如此 真的是使用C ++标准库的方式。
如果要将函数应用于容器的所有元素(或者
改变它们或创建新结果),使用std::transform
或
std::for_each
具有您要使用的功能。
std::vector<double> doubles, results;
std::transform(begin(doubles), end(doubles), std::back_inserter(results), sgn);
这使人们的担忧远远超过你目前的做法。只要 如果真的需要,则在整个集装箱上运行 case使用迭代器和高阶函数。