gpt4 book ai didi

C++17:使用 std::optional 评估枚举是否包含值

转载 作者:搜寻专家 更新时间:2023-10-31 00:07:33 24 4
gpt4 key购买 nike

我想在编译时检查各种枚举是否包含给定值,因此我编写了以下内容:

#include <optional>

enum class test_enum : int {
VALUE_0 = 0,
VALUE_1 = 1
};

// Template function to perform check
template<typename T>
constexpr std::optional<T> from_int(int value)
{
static_assert(false, __FUNCTION__ " not implemented for this type; see build output");
return std::optional<T>();
}

// Specialization for test_enum
template<>
constexpr std::optional<test_enum> from_int(int value)
{
switch (value) {
case static_cast<int>(test_enum::VALUE_0) :
return test_enum::VALUE_0;
case static_cast<int>(test_enum::VALUE_1):
return test_enum::VALUE_1;
default:
return std::optional<test_enum>();
}
}

int main(int argc, char* argv[])
{
static_assert(from_int<test_enum>(1));

return 0;
}

使用 Visual Studio 2017(版本 15.8.6),代码编译成功,输出中没有错误。但是,错误窗口显示

E0028: expression must have a constant value" at line 30. (the first line of main)

"std::_Optional_construct_base<test_enum>::_Optional_construct_base(std::in_place_t, _Types &&..._Args) [with _Types=<test_enum>]" (declared implicitly) is not defined)".

关于这是为什么的任何提示?我可以忽略 E0028,但如果可能的话,我不想这样做。

编辑:从 from_int 中删除 static_assert 不会更改错误。

最佳答案

似乎标准将此类代码定义为格式错误,不需要诊断。看看以下声明:

[The validity of a template may be checked prior to any instantiation.[ Note: Knowing which names are type names allows the syntax of everytemplate to be checked in this way. — end note ] The program isill-formed, no diagnostic required, if:

<...>

(8.4) a hypotheticalinstantiation of a template immediately following its definition wouldbe ill-formed due to a construct that does not depend on a templateparameter...] 1

要使其格式正确,请不要使用 static_assert(false)。相反,使用以下技巧(使用 GCC 7 和 CLang 7 编译):

#include <optional>

enum class test_enum : int {
VALUE_0 = 0,
VALUE_1 = 1
};

template<typename T>
constexpr bool false_t = false;

// Template function to perform check
template<typename T>
constexpr std::optional<T> from_int(int value)
{
static_assert(false_t<T>, "Not implemented for this type; see build output");
return std::optional<T>();
}

// Specialization for test_enum
template<>
constexpr std::optional<test_enum> from_int<test_enum>(int value)
{
switch (value) {
case static_cast<int>(test_enum::VALUE_0) :
return test_enum::VALUE_0;
case static_cast<int>(test_enum::VALUE_1):
return test_enum::VALUE_1;
default:
return std::optional<test_enum>();
}
}

int main()
{
static_assert(from_int<test_enum>(1));
}

关于C++17:使用 std::optional 评估枚举是否包含值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633405/

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