【问题标题】:C++ const std::array size from constructor来自构造函数的 C++ const std::array 大小
【发布时间】:2022-11-14 22:22:10
【问题描述】:

假设我从一个在类对象初始化时运行的 lambda 函数得到一个int。是否可以使用int 来定义std::array 的大小?类似于以下代码。

#include <array>
#include <vector>
#include <iostream>

class Test1 {

    public:
        Test1( std::vector<int> vec1 ) :
            nvars([&vec1]() -> int { return vec1.size()+1; }())
        {
        };

        const int nvars;
        // ******This isn't allowed!!!!!!!!!
        const std::array<int,nvars> arr;
};

int main() {
    std::vector<int> vec{1,2,3,4};
    Test1 test1(vec);
    std::cout << "nvars: " << test1.nvars << std::endl;

    return 0;
}

我是 C++ 初学者,因此欢迎任何其他建议。

【问题讨论】:

  • 不。大小是数组类型的一部分。类的定义必须知道成员的类型
  • 运行时常量(即在程序执行期间不能更改的值)和编译时常量(即编译器已知的值)之间存在差异。整数模板参数必须是编译时常量。
  • [&amp;vec1]() -&gt; int { return vec1.size()+1; }()vec1.size()+1 之间在功能上有什么区别吗?编辑:我猜它转换为int

标签: c++ arrays initialization constants size


【解决方案1】:

不,数组的大小是其类型的一部分。您不能让它在运行时确定。

如果将 std::array 传递给构造函数,则可以在编译时确定它。由于 C++17 有 CTAD(类模板参数推导),它可以让你写:

#include <array>


template <size_t N>
class Test1 {

    public:
        Test1( std::array<int,N> vec1 ) :
            arr(vec1)
        {
        };

        const std::array<int,N> arr;
};

int main() {
    std::array vec{1,2,3,4};
    Test1 test1(vec);
}

Live Demo

test1 的类型为 Test1&lt;4&gt;。请注意,Test1&lt;4&gt;Test&lt;5&gt;Test&lt;24&gt; 是截然不同的类型。如果您希望一种类型具有不同大小的成员数组,请将其设为std::vector

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2016-05-31
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多