gpt4 book ai didi

c++ - 在函数范围末尾执行代码的简单方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:52 26 4
gpt4 key购买 nike

<分区>

在测试代码中,偶尔我想设置/模拟一些全局变量,在测试/作用域结束时我想恢复这些变量。例如:

BOOST_AUTO_TEST_CASE(HttpClientCsrf)
{
std::string csrfSave = Http::getCsrfToken();
... some test code
Http::setCsrfToken(csrfSave); // restore csrf
}

这里明显的问题是,如果 一些测试代码 在到达结尾之前返回(或抛出),您将不会恢复该 csrfSave 变量。因此,简单的改进是编写一些简单的结构包装器,自动恢复 dtor 中的值:

struct CsrfSave
{
std::string csrfSave;
CsrfSave()
{
csrfSave = Http::getCsrfToken();
}
~CsrfSave()
{
Http::setCsrfToken(csrfSave);
}
};
BOOST_AUTO_TEST_CASE(HttpClientCsrf)
{
CsrfSave csrfSave;
... some test code
// dtor of CsrfSave restores csrf
}

这通常可以解决问题,但是,您需要为每个函数编写大量样板代码。因此,问题是:可以使用什么最短和最简单的方法来实现相同的目标,同时最大限度地减少并可能避免所有样板文件。

我使用的一种方法,但我对此不太满意:

BOOST_AUTO_TEST_CASE(HttpClientCsrf)
{
std::string csrfSave = RBX::Http::getLastCsrfToken();
shared_ptr<void> csrfSaveScope(NULL, [&](void*) {
RBX::Http::setLastCsrfToken(csrfSave);
});
... some test code
}

还有更好的吗?我宁愿避免编写任何实用程序类,也宁愿避免提升(除非它包含在 next std 中)。这种模式在不同的项目(不共享代码)中经常发生,每次我最终编写简单的结构包装器或采用 lambda 的通用包装器时,我希望看到其他可以就地编码的方法就像我在 shared_ptr exmpale 中展示的那样

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