gpt4 book ai didi

c++ - 类型向量化的适当通用习惯用法?

转载 作者:行者123 更新时间:2023-12-04 01:01:10 25 4
gpt4 key购买 nike

假设我有一个类型 T在 C++ 中。它有各种各样的方法,它可以用作一堆函数的参数等。

现在假设我想处理 T 类型的 k 个元素,其中 k 在编译时已知并且较小(例如 k=2 或 k=3);大多数/所有 Action 都是按元素进行的。自然地,我可以拿着一个 std::array<T, n>并用循环填充我的代码,例如:

for(auto i = 0; i < k; i++) { c[i] = foo( a[i], b[i] ); }

对于函数 T3 foo(T1 a, T2 b) .

但我想避免这种情况。是否有一些方便的习惯用法可以用来处理这些矢量化的 T,就好像它们只是 T 一样?

理想情况下,我可以写:

vectorized<T1> a = bar();
vectorized<T2> b = baz();
auto c = foo(a,b);

并且,仅基于上述 foo() 的存在,那行得通。我实际上并不期望能走那么远,但在那个大方向上没有循环的东西会很好。

注意:

  • 我们在这里不讨论 SIMD 向量化(尽管这是编译器需要考虑的潜在优化)。
  • 不幸的是,C++14 解决方案是首选。 C++17/20 解决方案是相关的(但不会是公认的答案,因为我坚持使用 C++14)。

最佳答案

如果您需要做的只是按元素操作,并且您可以使用语法 auto c = elementwise_invoke(foo, a,b);而不是 auto c = foo(a,b); , 那么你或许可以看看 boost::hana::zip_with ,它允许您的 self 回答中的语法,前提是您制作 std::array一个 Sequence .

不知道为什么std::array不是 Sequence (就像我不知道为什么 std::vectorFunctor 的实例是 #if 0 一样);然而,制作起来非常简单:

来自 Sequence 的文档你看到最小的完整定义需要 Iterable , Foldable , 和 make .前两个已经可用 #include <boost/hana/ext/std/array.hpp> , 所以你只需要自定义 make通过实现 make_impl :

namespace boost::hana {
template <>
struct make_impl<ext::std::array_tag> {
template <typename ...Xs>
static constexpr
std::array<std::common_type_t<Xs...>, sizeof...(Xs)>
apply(Xs&& ...xs) {
return {static_cast<Xs&&>(xs)...};
}
};
}

我用过的地方 std::common_type_t 确保 std::array构造成可以容纳所有输入。

很明显,您还需要将 std::array 形式化确实是 Sequence :

namespace boost::hana {
template <>
struct Sequence<ext::std::array_tag> {
static constexpr bool value = true;
};
}

Here's the demo.

我不知道编译时间开销,但我相信 Boost.Hana 非常棒。

关于c++ - 类型向量化的适当通用习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68178905/

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