![](/img/trans.png)
[英]Do I have to overload every operator for a class to behave like one of its member variables?
[英]Do I have to overload functions for every different parameter?
我想创建一个 function 来简化列表/向量。 我可以在 python 中完成:
i = [1, 2, 3, 4, 5]
f = [1.1, 2.2, 3.3, 4.4, 5.5]
s = ["one", "two", "three", "four", "five"]
def simplify(lst):
if len(lst) == 0:
return 0
tmp = lst[0]
for x in range(1, len(lst)):
tmp += lst[x]
print(tmp)
return tmp
simplify(i)
simplify(f)
simplify(s)
但是对于 c++ 我必须为许多变量类型( long long
、 double
、 int
、 string
、 char
)编写相同的 function 。 我的问题是,我可以像在 python 中那样在 c++ 中做吗? (为多种类型创建一个 function)
我的问题是,我可以像在 python 中那样在 c++ 中做吗? (为多种类型创建一个 function)
几乎。 C++ function 模板不是 function,但使用它看起来无法区分。
如果序列为空,您也会为选择-1
作为结果而苦恼,因为-1
不是字符串。
template <typename Range>
std::ranges::range_value_t<Range> simplify(Range && range) {
auto it = std::ranges::begin(range);
if (it == std::ranges::end(range)) return -1; // this will fail for strings
auto result = *it++;
for (; it != std::ranges::end(range); ++it) {
result += *it;
}
std::cout << result; // I assume this is for testing the function?
return result;
}
如果您对如何处理空输入做出不同的选择,则标准库中有一个与您非常相似的 function:
template <typename Range>
std::ranges::range_value_t<Range> simplify(Range && range) {
std::ranges::range_value_t<Range> zero {}; // 0 for numbers, empty string for strings, etc.
return std::accumulate(std::ranges::begin(range), std::ranges::end(range), zero);
}
int main() {
std::vector<int> i {1, 2, 3, 4, 5};
std::vector<double> f {1.1, 2.2, 3.3, 4.4, 5.5};
std::vector<std::string> s {"one", "two", "three", "four", "five"};
std::cout << simplify(i);
std::cout << simplify(f);
std::cout << simplify(s);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.