gpt4 book ai didi

c++ - 如何使用与成员初始值设定项列表一起使用的 static_assert

转载 作者:行者123 更新时间:2023-11-28 00:09:20 25 4
gpt4 key购买 nike

我想使用 static_assert 对我的类的配置实现各种限制。早些时候,我只使用一个枚举,并且只允许一个需要所述枚举的构造函数来对我的类实现限制。如果我有类似下面的内容并且范围是从 0 到 4,这很好用,但是一旦我有 0 到 500 的范围,那么使用枚举就变得笨拙了。

一些类.h

class Some_Class {
public:
Some_Class(const unsigned int param);
private:
const unsigned int member_param;
};

Some_Class.cpp

Some_Class::Some_Class(const unsigned int param) : member_param(param) {
static_assert(member_param < 500, "Param must be less than 500.");
};

main.cpp

Some_Class foo4(125); // OK
Some_Class foo5(500); // Should fail at compile time.

这是 GCC 在使用 C++14 编译时抛给我的:

1>  Some_Class.cpp: In constructor 'Some_Class::Some_Class(unsigned int)':
1>C:\some_path\Some_Class.cpp(3,2): error : non-constant condition for static assertion
1> static_assert(member_param < 500, "Param must be less than 500.");
1> ^
1>C:\some_path\Some_Class.cpp(3,2): error : use of 'this' in a constant expression

最佳答案

constexpr 中不能使用参数值。

你必须以某种方式提交编译时值:

  • 为您的整个类(class)制作模板:

    template<unsigned int size>
    class Some_Class {
    static_assert(size < 500, "Size should be less than 500");
    public:
    constexpr unsigned int member_param = size;
    };
  • 传递一个 integral_constant:

    template <unsigned int N>
    using uint_c = std::integral_constant<unsigned int, N>;

    class Some_Class {
    public:
    template<unsigned int size>
    Some_Class(uint_c<size>) : member_param(size)
    {
    static_assert(size < 500, "Size should be less than 500");
    }
    private:
    unsigned int member_param;
    };

关于c++ - 如何使用与成员初始值设定项列表一起使用的 static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33930464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com