这不是一个实际问题,但我正在寻找一种模式来改善以下逻辑:
void PrintToGameMasters()
{
std::string message = GetComplicatedDebugMessage(); // This will create a big string with various info
for (Player* player : GetAllPlayers())
if (player->IsGameMaster())
player->SendMessage(message);
}
Run Code Online (Sandbox Code Playgroud)
该代码有效,但我遇到的问题是,在大多数情况下,没有任何gamemasters参与者,因此消息编写将一事无成。
我想写一些只会在第一次使用该变量时就创建消息的东西,但是在这里我无法提出一个好的解决方案。
编辑:为了使这个问题更精确,我正在寻找一个不是特定于字符串的解决方案,它可能是一个没有函数来测试它是否已初始化的类型。如果我们可以将调用保持在GetComplicatedDebugMessage循环的顶部,这也是一个很大的奖励点,我认为一个涉及包装器的解决方案可以解决这个问题。
我使用 char* 数组来存储不同的数据类型,如下一个示例所示:
int main()
{
char* arr = new char[8];
*reinterpret_cast<uint32_t*>(&arr[1]) = 1u;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用clang UndefinedBehaviorSanitizer编译运行会报如下错误:
runtime error: store to misaligned address 0x602000000011 for type 'uint32_t' (aka 'unsigned int'), which requires 4 byte alignment
Run Code Online (Sandbox Code Playgroud)
我想我可以用另一种方式来做,但为什么这是未定义的行为?这里涉及到哪些概念呢?
c++ ×2