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

使用STD::类型T的数组来构造STD::从T构造的类型数组

  •  2
  • stimulate  · 技术社区  · 6 年前

    请考虑以下类型:

    struct Part
    {
        float data;
    };
    
    struct Wrap
    {
        Wrap( const Part& p )
            :data( p.data )
        {}
        float data;
    };
    

    现在我想用一个 std::array<Part, N> 初始化 std::array<Wrap, N> .

    int main()
    {
        std::array<Part, 3> parts{ Part{ 1.0f }, Part{ 2.0f }, Part{ 3.0f } };
        std::array<Wrap, 3> wrappers( parts );
        return 0;
    }
    

    (这将抛出错误 "conversion from 'std::array<Part, 3>' to non-scalar type 'std::array<Wrap, 3>' requested" )

    我怎么能用 std::array 类型的 T 初始化 STD::阵列 可从 T ?

    2 回复  |  直到 6 年前
        1
  •  2
  •   joe_chip    6 年前

    您可以使用helper函数自动转换:

    // Convert each element based on a sequence of indices:
    template<typename ToType, typename FromType, std::size_t... Indices>
    std::array<ToType, sizeof...(Indices)>
    convert_impl(const std::array<FromType, sizeof...(Indices)>& input, std::index_sequence<Indices...>)
    {
        return {ToType(std::get<Indices>(input))...};
    }
    
    // Wraps convert_impl to hide the use of index_sequence from users:
    template<typename ToType, typename FromType, std::size_t N>
    std::array<ToType, N> convert(const std::array<FromType, N>& input)
    {
        return convert_impl<ToType>(input, std::make_index_sequence<N>{});
    }
    
    int main()
    {
        std::array<Part, 3> parts {Part{1.0f}, Part{2.0f}, Part{3.0f}};
        std::array<Wrap, 3> wraps = convert<Wrap>(parts);
    
        return 0;
    }
    
        2
  •  1
  •   bipll    6 年前

    可能的简单选项有:

    使用情况 vector 相反(数组仍然是邪恶的0)。

        std::vector<Part> ps{Part{1.0}, Part{2.0}, Part{3.0}};
        std::vector<Wrap> ws(ps.cbegin(), ps.cend());
    

    一、讲清楚。

        std::array<Part, 3> parts{ Part{ 1.0f }, Part{ 2.0f }, Part{ 3.0f } };
        std::array<Wrap, 3> wrappers = {parts[0], parts[1], parts[2]};
    

    二。拆分构造和初始化。

    struct Unwrap {
        Unwrap() {}
        Unwrap(Part const &p): data(p.data) {}
        float data;
    };
    
    int main() {
        std::array<Part, 3> parts{ Part{ 1.0f }, Part{ 2.0f }, Part{ 3.0f } };
        std::array<Unwrap, 3> unwrappers;
        std::copy(parts.cbegin(), parts.cend(), unwrappers.begin());
    }
    

    顺便问一下,你的代码中是否有括号 Part 初始化甚至编译?我只能把它们换成牙套。