关于内省/静态断言的问题(C++17)

关于内省/静态断言的问题(C++17),c++,c++17,C++,C++17,我有一个类似容器的类,它接受我的几个其他类型/类作为数据成员。现在我想指定数据类型的一些属性edit:positive integer作为编译时信息。这很好,但我想声明,提供的类型是正确的uint8\t,对于大多数数据类型类,实际值是不同的。我用uint8\u t将数字设置为std::integral\u常量 1如何做到这一点?请参阅提供的示例代码? 2有更好的方法吗 我可以使用高达c++17的语言功能 为澄清而编辑 你想做什么取决于你想检查什么 要检查char\u count的值是否为2?st

我有一个类似容器的类,它接受我的几个其他类型/类作为数据成员。现在我想指定数据类型的一些属性edit:positive integer作为编译时信息。这很好,但我想声明,提供的类型是正确的uint8\t,对于大多数数据类型类,实际值是不同的。我用uint8\u t将数字设置为std::integral\u常量

1如何做到这一点?请参阅提供的示例代码? 2有更好的方法吗

我可以使用高达c++17的语言功能

为澄清而编辑


你想做什么取决于你想检查什么

要检查char\u count的值是否为2?static_assertDataType::char_count::value==2,char_count不是2!; 是否要检查char\u count是否为整型常量,或者是否有uint8\u t作为类型成员类型别名?静态资产std::is_same_vtypename DataType::char_count::value_type,char_count不是uint8_t!; 要检查char\u count是否为值为2的整型常量,并键入uint8\u t?静态资产std::是否相同,字符计数是否不为2或不为uint8!;
我不想检查值,但要检查类型。静态资产std::is_same_vtypename数据类型::char_count::type,uint8\u t>,char_count不是uint8\u t!`似乎可以编译但不起作用uint8\u t是否隐式转换为int或其他形式?!我想N314159的答案中有一个输入错误,它是用value_type而不是typep来工作的。是的,是的,脑子里有点问题。std::integral_常量有一个类型成员,但这对您来说并不有趣,请看第一个示例有一个输入错误:is_same_v的参数列表以>过早终止。对于你的第二个,请定义也不起作用。但最终,你会试图将一个类型与一个值进行比较,所以不管怎样,它都不会起作用。谢谢你指出这一点,我只是在之后才意识到。我希望decltype能够做到这一点,但即使char\u count是std::integral\u常量,使用第二个静态断言也总是失败。正确的解决方案似乎是使用std::integral\u常量的::value\u类型。
class DataClass
{
     public:
        // compile time information about char count
        using char_count = std::integral_constant<uint8_t, 2>;

     private:
        ...
}

class DataClass2
{
     public:
        // compile time information about char count
        using char_count = std::integral_constant<uint8_t, 4>;

     private:
        ...
}

template <typename DataType, ...>
class ContainerClass
{
     private:
        // does not work: error C2923: 'std::is_same_v':
        // 'value' is not a valid template type argument for parameter '<unnamed-symbol>'
        static_assert(std::is_same_v<DataType::char_count::value, uint8_t>, "not uint8_t");
        // this also does not work
        static_assert(std::is_same_v<decltype(DataType::char_count::value), uint8_t>, "also not uint8_t");

        // using the value actually works fine
        constexpr static auto char_count = DataType::char_count::value;

     public:
        ...
}