![](/img/trans.png)
[英]How to define number of bits to generate using independent_bits_engine?
[英]Failed to randomize bytes using independent_bits_engine
我正在嘗試隨機化一個字節數組,但由於以下錯誤,它不允許我編譯它。 它甚至不適用於byte
而不是std::uint8_t
。
錯誤 C2338:independent_bits_engine 的無效模板參數:N4659 29.6.1.1 [rand.req.genl]/1f 需要 unsigned short、unsigned int、unsigned long 或 unsigned long long 之一
消息:請參閱正在編譯的 class 模板實例化 'std::independent_bits_engine<std::mt19937,8,unsigned char>' 的參考
錯誤 C2338:注意:不允許使用 char、signed char、unsigned char、char8_t、int8_t 和 uint8_t
template<std::size_t N>
void generate_random_key(std::uint8_t(&iv_buff)[N])
{
using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, std::uint8_t>;
random_bytes_engine rbe;
std::generate(std::begin(iv_buff), std::end(iv_buff), std::ref(rbe));
}
[rand.req.genl]/1.6
(在 C++23 草案中):
在整個子條款
[rand]
中,實例化模板的效果:
具有名為
UIntType
的模板類型參數的參數是未定義的,除非相應的模板參數是 cv-unqualified 並且是unsigned short
、unsigned int
、unsigned long
或unsigned long long
之一。
因此,效果是根據標准未定義的,因為您沒有使用上述類型之一。
您可以使用unsigned short
來獲得相同的效果:
template<std::size_t N>
void generate_random_key(std::uint8_t(&iv_buff)[N])
{
using random_bytes_engine = std::independent_bits_engine<std::default_random_engine,
CHAR_BIT, unsigned short>;
random_bytes_engine rbe;
std::generate(std::begin(iv_buff), std::end(iv_buff), rbe);
}
如果您收到警告(例如“從unsigned short
轉換為_Ty
,可能丟失數據”),您可以將對 rbe 的調用包裝在rbe
中並執行static_cast
:
std::generate(std::begin(iv_buff), std::end(iv_buff), [&rbe]() {
return static_cast<std::uint8_t>(rbe());
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.