【发布时间】:2015-12-15 23:44:57
【问题描述】:
我想编写一个函数,它可以以类型安全的方式在给定的泛型类型上输入迭代器。一个可能的用例是编写一个函数,如累积/映射/折叠:
#include <iterator>
#include <vector>
#include <functional>
template <typename V, typename K>
K accumulate(
std::function<K(K, V)> accumulator,
/* WHAT TYPE DO I PUT HERE */ it,
/* WHAT TYPE DO I PUT HERE */ end,
K initial) {
K sum = initial;
for (; it != end; ++it) {
V item = *it;
sum = accumulator(sum, item);
}
return sum;
}
我怎样才能以编译器检查类型和所有好东西的方式做到这一点?
以前问过here
【问题讨论】:
-
不清楚你在问什么。编译器无论如何都会检查类型。请澄清一下,“所有这些好东西”。
-
同时,您可以从HERE 的实践中获得一些类似 STL 的实现的灵感。例如,您的accumulate。当然,您可以随时打开您喜欢的标准库的头文件并阅读它们。附言让我们为 C++17 和concepts祈祷。
-
Sam 希望避免像
bool a = false, b = true; bool *ap = &a, *bp = &b; print_all(ap, bp);这样会通过基本类型检查的废话。 -
@user4581301 如果您想检测到,请运行消毒剂。
-
也许我遗漏了一些明显的东西,但在我看来,模板只需要另一个参数,“typename I”,“I”变成“我应该放什么”。