gpt4 book ai didi

c++ - 访问顺序序列元素的通用方法

转载 作者:行者123 更新时间:2023-11-30 04:08:55 26 4
gpt4 key购买 nike

编写针对 C 数组、C++ 库和 C++ 标准库的通用代码的最佳方法是什么?

示例:点积

template<class Vector1, class Vector2>
constexpr auto dot_product(Vector1 const& v1, Vector2 const& v2) {
// doesn't work for Vectors that do not implement () subscripting
using return_type = decltype(v1(0) + v2(0));
return_type tmp = return_type{};
// doesn't work for e.g. std::tuple
for (std::size_t i = 0, e = size(v1); i != e; ++i) {
tmp += v1(i) * v2(i);
}
return tmp;
}
  • 访问元素时出现问题:

    • 对于 C 数组 array[i] , C 矩阵 array[i][j]
    • 对于 C++ std::vector , vector[i]
    • 对于 C++ tuple , std::get<i>(tuple)
    • 对于 C++ 线性代数 vector/矩阵(例如 Eigen):vector(i) , matrix(i, j)
  • 迭代有问题:

    • C 数组的循环运行时,std::vectors , ...
    • boost::fusion例如std::array , std::tuple , ...
    • 线性代数库的自定义表达式,可在幕后处理这两种情况(例如,Eigen 使用表达式模板)
  • Boost.Geometry 使用 get功能解决访问问题导致复杂的代码充满get无处不在。它还使用策略来调度不同的迭代方法。

有没有更好的选择?

最佳答案

您可以使用基于策略的模板。

template <typename T> 
struct DefaultUsePolicy {
int DoSomethingWithT( T const & ) {
return 42;
}
};
template < typename T, typename UsePolicy = DefaultUsePolicy<T>>
int Generic( T& arg ) {
UsePolicy use;
return use.DoSomethingWithT(arg);
}

然后有一些常见类型的默认实现,如果用户有自定义类型,则让他写一个策略。

通用功能将在其所需的策略中记录所需的服务。

它类似于用 std::unique_ptrstd::default_deleter 提供对所拥有指针销毁的控制。

关于c++ - 访问顺序序列元素的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21579542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com