繁体   English   中英

我是否必须为每个不同的参数重载函数?

[英]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 longdoubleintstringchar )编写相同的 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);
}

在 coliru 上看到它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM