关于更现代的C++“首选”样式,我有一个烦恼的问题。
假设我想使用 std::random
的内容来从 enum class
中选择一个值。我该如何应对?我们谈论的是一些非常基础的东西,第一个选择可以正常工作,但 Visual Studio因为我使用了裸枚举而责备我(正确地):
enum Direction:uint8_t {
Left, Right
};
std::uniform_int_distribution<uint8_t> direction(Direction::Left, Direction::Right);
// and so on...
我很惊讶enum-base可以用于经典的enum
。但是,只需将单词class
添加到混合物中就会导致整个过程无法编译。
enum class Direction:uint8_t {
Left, Right
};
std::uniform_int_distribution<uint8_t> direction(Direction::Left, Direction::Right);
// Severity Code Description Project File Line Suppression State
// Error C2338 invalid template argument for uniform_int_distribution:
// N4659 29.6.1.1 [rand.req.genl]/1e requires one of short, int, long, long long, unsigned short,
// unsigned int, unsigned long, or unsigned long long
// C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\
// include\random 1863
等等等。
为了解决这个问题,我当然可以放下自己的骄傲和原则,但我想遵守现代标准。
如果有人能提供一些聪明的变通方法或其他最佳实践方式,让我们能够像这样洗牌 enum
,那我将非常高兴。
std::uniform_int_distribution<uint8_t> direction(static_cast<std::uint8_t>(Direction::Left), static_cast<std::uint8_t>(Direction::Right));
应该可以工作。 - StazDirection
对象的返回类型不行。 - Pete Beckerdirection(...)
将返回std::uint8_t
。因此,对于作用域枚举,也不会有任何隐式转换。你还需要进行强制类型转换。代码如下:auto rand_dir = static_cast<Direction>(direction(...));
- Staz