c++ - 模板化类构造函数中的 static_assert

标签 c++ arrays stl initializer-list

我正在尝试创建一个由 std::initializer_list 初始化的示例数组类。我想在编译时检查初始化列表的大小是否不超过数组的大小。由于静态断言只能评估 constexpr,因此不会编译此代码。

#include<initializer_list>
#include<cstddef>

template <typename T , size_t _size>
class array
{

    private:
    T arr[_size];

    public:
    array()
    {
    }

    array(std::initializer_list<T> arrList)
    {
        static_assert(_size>arrList.size(),"too many initializers"); // error: non-constant condition for static assertion

    }

    ~array()
    {
    }

};

int main()
{
    array<int,4> arr = {1,2,3,4,5}; 


    return 0;
}
std::array 已经有这个功能,但我在头文件中找不到它的实现。
#include<array>

int main()
{
    std::array<int,5> arr= {1,2,3,4,5,6}; // error: too many initializers for ‘std::array<int, 5>’
    return 0;
    
}

最佳答案

你不能用 std::initializer_list , arrList.size()不能在常量表达式中使用,尽管它的 size()成员函数声明为 constexpr .看看this question .std::array用途 aggregate initialization ,它没有接受 std::initializer_list 的构造函数.就是这样std::array通常是 implemented :

template<typename T, std::size_t size>
struct array {
    T arr[size];
    /* member functions */
};
或者(调用构造函数的语法略有不同),您可以创建一个通过引用接受数组的构造函数:
template<typename T, std::size_t size>
class array {
public:
    template<std::size_t s>
    array(const T(& a)[s]) {
        static_assert(s <= size, "too many initializers");
    }
private:
    T arr[size];
};
然后
array<int, 4> arr({1, 2, 3, 4, 5}); // error: static_assert failed due to requirement
                                    // '5UL <= 4UL' "too many initializers"
由于 static_assert,编译失败.但是,您需要在 array 中使用一些技巧。构造函数来执行 arr 的实际初始化数据成员(你不能做 arr(a) )。

关于c++ - 模板化类构造函数中的 static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66667746/

相关文章:

c++ - 将 boost cpp_int 用于 pow() 和 rand() 等函数

php - 为什么 print_r 仍然打印出一个 Json 对象?

c# - 有没有更有效的方法来禁用多个脚本,同时在 Unity 中的单个游戏对象上保持一些事件?

c++ - boost::lambda : _1 不是类或命名空间

c++ - 仅在添加第二个项目后才出现第一个项目的编译错误

c++ - Conan 包从官方仓库迁移到本地私有(private)仓库

c++ - 为什么不能从信号处理程序调用 dlclose()?

java - 读取一个文本文件并存储每个出现的字符

c++ - std::map::find 的效率与值的数据大小有关吗?

具有默认参数的 C++ 模板