【问题标题】:Initialize std::array with implied length [duplicate]使用隐含长度初始化 std::array [重复]
【发布时间】:2014-03-31 04:09:53
【问题描述】:

在 C 中你可以使用 int a[] = {1,2,3,4,5},但 C++11 std::array<int> a = {1,2,3,4,5} 会给出“模板参数太少”的编译错误。有什么办法吗?

【问题讨论】:

    标签: c++ arrays c++11 stdarray


    【解决方案1】:

    您可以拥有的最好的是make_array,例如:

    template<typename T, typename...Ts>
    constexpr std::array<T, 1 + sizeof...(Ts)> make_array(T&& head, Ts&&...tail)
    {
         return {{ std::forward<T>(head), std::forward<Ts>(tail)... }};
    }
    

    【讨论】:

    • 为什么是1 + sizeof...(Ts)?多余的空间有什么用?
    • @0x499602D2:1是第一个参数T head(我们从head推断类型)。
    【解决方案2】:

    std::array 的实现:

    template<typename T, std::size_t N>
    struct array {
        T array_impl[N];
    };
    

    所以这应该工作:

    std::array<std::int, 5> a = {{ 1, 2, 3, 4, 5 }};
    

    本质上就像(编译器同意去掉内大括号。

    std::array<std::int, 5> a = { 1, 2, 3, 4, 5 };
    

    【讨论】:

    • 那么不说数组的长度是5怎么办呢?
    • 您确实指定了数组 Rikayan,查看传递给模板的第二个模板参数..
    • @DoryZidon 这没有回答他的问题。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 2020-10-20
    • 2015-09-04
    • 1970-01-01
    • 2015-10-05
    • 2012-02-10
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多