这是递推_C++中各种类型任意嵌套Iterable实现的计数函数和Boost.MultiArray在C++中的求和函数的后续问题.我正在尝试实现一个arithmetic_mean模板函数,用于计算各种类型的任意嵌套可迭代事物的算术平均值。这里使用了recursive_reduce函数(多亏了格·斯利平的答复)和recursive_size函数。因为这里的recursive_reduce函数和recursive_size函数都需要arithmetic_mean函数,所以有两个新的概念is_recursive_reduceable和is_recursive_sizeable创建如下。
template<typename T>
concept is_recursive_reduceable = requires(T x)
{
recursive_reduce(x, 0.0);
};
template<typename T>
concept is_recursive_sizeable = requires(T x)
{
recursive_size(x);
};接下来,arithmetic_mean模板函数的主要部分:
template<class T> requires (is_recursive_reduceable<T> && is_recursive_sizeable<T>)
auto arithmetic_mean(const T& input)
{
return (recursive_reduce(input, 0.0)) / (recursive_size(input));
}这个arithmetic_mean模板函数的一些测试用例。
// std::vector<int> case
std::vector<int> test_vector = {
1, 2, 3
};
auto arithmetic_mean_result1 = arithmetic_mean(test_vector);
std::cout << arithmetic_mean_result1 << std::endl;
// std::vector<std::vector<int>> case
std::vector<decltype(test_vector)> test_vector2 = {
test_vector, test_vector, test_vector
};
auto arithmetic_mean_result2 = arithmetic_mean(test_vector2);
std::cout << arithmetic_mean_result2 << std::endl;
// std::deque<int> case
std::deque<int> test_deque;
test_deque.push_back(1);
test_deque.push_back(1);
test_deque.push_back(1);
auto arithmetic_mean_result3 = arithmetic_mean(test_deque);
std::cout << arithmetic_mean_result3 << std::endl;
// std::deque<std::deque<int>> case
std::deque<decltype(test_deque)> test_deque2;
test_deque2.push_back(test_deque);
test_deque2.push_back(test_deque);
test_deque2.push_back(test_deque);
auto arithmetic_mean_result4 = arithmetic_mean(test_deque2);
std::cout << arithmetic_mean_result4 << std::endl;欢迎所有建议。
摘要资料:
arithmetic_mean模板函数是本文的主要部分。is_recursive_sizeable和is_recursive_reduceable概念是否是个好主意。此外,我想知道所用概念的名称是可以理解的。发布于 2020-11-27 13:35:40
与其简单地打印输出,不如进行自我检查单元测试,这样您就可以在发生故障时立即失败构建,而不必注意到输出中的更改。
您可能希望包含一些具有非常大的(正和负)值的测试,以确保使用这些测试得到准确的结果,并且不会与整数溢出(这将导致对无符号类型的严重不准确,以及对带符号整数类型的未定义行为)发生冲突。
令人失望的是,除了int之外,没有使用原始类型的测试。
https://codereview.stackexchange.com/questions/252732
复制相似问题