【问题标题】:C++ templates pointer-to-reference-type tomfooleryC++ 模板指向引用类型的tomfoolery
【发布时间】:2021-10-12 06:39:25
【问题描述】:

我有以下结构静态方法:

template<typename Edge1, typename Edge2, typename... Edges>
requires std::derived_from<Edge1, Edge> && std::derived_from<Edge2, Edge> && (std::derived_from<Edges, Edge> && ...)
[[nodiscard]] static constexpr bool are_multi_edges(const Edge1& edge1, const Edge2& edge2, const Edges&... edges)
{
    // If only two edges were passed to the function, there's no need for any extra logic.
    if constexpr (sizeof...(edges) == 0)
        return edge1 == edge2;

    // Problem here //
    std::array<Edge, sizeof...(edges) + 1> array {edge2, edges...};
    // Problem here //

    for (auto& [from, to] : array)
        if (from != edge1.from || to != edge1.to)
            return false;
        
    return true;
}// with "Edge" being the name of the actual struct housing the static method.

强调 std::arrayEdge, ........ > ..

如果我让“Edge”保持原样,代码可以编译并正常工作,但我怀疑它会将edge2edges 复制到数组中,这是不必要的。我尝试用“Edge&”替换“Edge”以避免复制并得到以下错误:

/usr/include/c++/10/array: In instantiation of ‘struct std::array<Edge<>&, 1>’:

/home/selamba/CLionProjects/graphs_lol/graph.h:41:43: required from ‘static constexpr bool Edge<VertexType>::are_multi_edges(const Edge1&, const Edge2&, const Edges& ...) [with Edge1 = Edge<>; Edge2 = Edge<>; Edges = {}; VertexType = char]’


/home/selamba/CLionProjects/graphs_lol/main.cpp:13:51:   required from here


/usr/include/c++/10/array:97:35: error: forming pointer to reference type ‘std::array<Edge<>&, 1>::value_type’ {aka ‘Edge<>&’}


   97 |       typedef value_type*         pointer;


      |                                   ^~~~~~~

主要内容是“形成指向引用类型的指针”。这只是错误消息的顶部,因为实际消息非常庞大。所有的错误实际上都在“array”头文件中(usr/include/c++/10/array)。

是否可以在我的用例中形成边缘引用的 std::array ?如果是这样,我该怎么做?

【问题讨论】:

    标签: c++ pointers templates reference


    【解决方案1】:

    使用标准引用包装器。引用不规则,不适合在标准容器中使用。

    引用包装器介于引用和指针之间,但其规则性足以成为容器内容。

    【讨论】:

    • 感谢您发表评论需要另外 6 个符号
    猜你喜欢
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2011-08-02
    • 2019-06-21
    相关资源
    最近更新 更多