代码之家  ›  专栏  ›  技术社区  ›  Enlico

如何使std::vector类成为序列,以便将其传递给boost::hana::group?

  •  0
  • Enlico  · 技术社区  · 5 年前

    我希望编译并运行以下代码:

    #include <boost/hana/group.hpp>
    #include <functional>
    #include <vector>
    int main() {
        std::vector<int> x = {1,1,3,4};
        auto groups = boost::hana::group(x, std::equal_to<>{});
    }
    

    试图编译如下错误:

    $ g++ -std=c++2a deleteme.cpp && ./a.out
    In file included from deleteme.cpp:1:
    /usr/include/boost/hana/group.hpp: In instantiation of ‘constexpr auto boost::hana::group_t::operator()(Xs&&, Predicate&&) const [with Xs = std::vector<int>&; Predicate = std::equal_to<void>]’:
    deleteme.cpp:6:44:   required from here
    /usr/include/boost/hana/group.hpp:55:42: error: static assertion failed: hana::group(xs, predicate) requires 'xs' to be a Sequence
       55 |         static_assert(hana::Sequence<S>::value,
          |                                          ^~~~~
    /usr/include/boost/hana/group.hpp:59:28: error: use of deleted function ‘static constexpr auto boost::hana::deleted_implementation::apply(T&& ...) [with T = {std::vector<int, std::allocator<int> >&, std::equal_to<void>}]’
       59 |         return Group::apply(static_cast<Xs&&>(xs),
          |                ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
       60 |                             static_cast<Predicate&&>(pred));
          |                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /usr/include/boost/hana/core/dispatch.hpp:14,
                     from /usr/include/boost/hana/drop_front.hpp:18,
                     from /usr/include/boost/hana/concept/iterable.hpp:20,
                     from /usr/include/boost/hana/at.hpp:16,
                     from /usr/include/boost/hana/group.hpp:15,
                     from deleteme.cpp:1:
    /usr/include/boost/hana/detail/dispatch_if.hpp:21:31: note: declared here
       21 |         static constexpr auto apply(T&& ...) = delete;
          |                               ^~~~~
    

    因此我明白原因是 std::vector 不满足 Sequence ,但我该如何执行它呢?

    我一直在看 /usr/include/boost/hana/fwd/concept/sequence.hpp /usr/include/boost/hana/concept/sequence.hpp ,但目前,这些文件中的模板元编程对我来说仍然有点沉重,无法在没有任何帮助的情况下理解它。

    This is an excerpt from Hana's documentation ,我认为这解决了这个问题。重点是我不知道如何将处方翻译成代码:

    因此,有必要专门化 Hana命名空间中的SequenceMeta函数告诉Hana 这确实是一个顺序。明确专业化 SequenceMetaFunction可以被看作是一个印章,上面写着“此数据” 类型满足a的附加法则 序列 “,因为它们不能 由Hana自动检查。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Jason Rice    5 年前

    虽然可以在Boost中实现一些概念。只有在运行时才知道涉及不同维度的Hana类型,Boost。哈娜。序列及其“最小完整定义”中的一些概念需要在编译时知道长度和元素。

    • Foldable 要求在编译时知道长度。
    • Iterable 要求每个元素在编译时都可以访问。
    • Sequence 要求 可折叠 可迭代的 .

    这个 group 需要 序列 以及 std::vector 让这一切变得不可能。

    部门 Computational Quadrants 在推进中。Hana手册详细介绍了需要编译时和运行时信息的算法。

    (小标题) Group 这个概念可能是可行的,但我不认为这是问题的一部分。)

    关于为标准类型专门化第三方模板的评论,这是可能的,但被认为是糟糕的形式。解决方案是制作某种包装类型或提供自己的概念。

    编辑:

    一条评论建议了一个实施的例子 std::array 作为一个 序列 因为它的长度在编译时是已知的。而我却在法律中找不到一颗灵丹妙药 序列 这就禁止了同质类型的列表,我可以说 序列 正在处理异构类型的数据结构。元素可能包含运行时数据,但算法中的所有谓词都完全依赖于“编译时”信息,因此 对我来说完全没用 std::数组 (以上链接对此进行了解释)

    推荐文章