我正在编写一个将运行数百个测试的测试框架。这些测试中的每一个都被编写为独立功能。目前,我的主要功能是逐个运行这些测试。我想制作一个使用标签的系统。例如,我希望能够使用“WiFi”标签运行所有测试,或者运行所有带有“notifications”标签的测试。
我已经尝试查找如何执行此操作,但是我只能找到有关tag dispatching的文章,但对我没有帮助。也许标签不是我所需要的?
不知道这是否重要,但是我正在Mac上用c++ 11编写,并且正在使用VS Code。
顺便说一句,我是堆栈溢出的新手,如果我搞砸了什么,抱歉。提前致谢!
编辑:
我将每个功能使用多个标签。例如,有一个功能需要“WiFi”和“网络”标签,而另一个功能则需要“Haptic”,“Notification”和“Network”标签。
最佳答案
您的研究进展不佳的原因是“标签”是一个非常宽泛的通用术语,并未真正描述您在做什么。
从根本上讲,您正在尝试将两个数据映射到一起。就是这样。这些片段(您的“标记”)之一是整数,枚举成员,字符串,类实例还是其他任何东西都没有关系。
您已经说过“每个标签我都需要一个新 map ”,但是我不同意。您只需要一个从“标签”到函数的多重映射(最糟糕的是,如果您也需要反向查找,则另一个从函数到“标签”的多重映射)。这些都是微不足道的。
enum class Tag
{
WiFi,
Haptic,
Network,
Notification
};
using Function = std::function<void()>; // or whatever it is
std::multimap<Tag, Function> tagLookup;
void BindTag(const Tag tag, Function func)
{
tagLookup.emplace(tag, std::move(func)); // I'm using move out of habit
}
void RunFuncsForTag(const Tag tag)
{
auto [start, end] = tagLookup.equal_range(tag);
for (auto it = start; it != end; ++it)
{
const Function& func = it->second;
func();
}
}
int main()
{
BindTag(...);
BindTag(...);
RunFuncsForTag(tag);
}
诚然,如果您不想要
std::function
的大量副本,则需要做更多的工作(您可以将它们存储在另一个容器中,并可以通过其他映射对存储一次的每个函数进行查找),但是基本数据存储这里的原理很简单。
关于c++ - 如何在C++中基于标签运行特定功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62070643/