c++ - 如何在C++中基于标签运行特定功能?

标签 c++ c++11

我正在编写一个将运行数百个测试的测试框架。这些测试中的每一个都被编写为独立功能。目前,我的主要功能是逐个运行这些测试。我想制作一个使用标签的系统。例如,我希望能够使用“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/

相关文章:

c++ - 原子变量是无锁的吗?

c++ - GMOCK 方法抛出编译错误

c++ - Nintendo DS 平铺图形中的奇怪条纹

c++ - 有没有办法从一个目录中读取两条路径?

c++ - C++ 中的 FIR 滤波器

c++ - 没有 lpthread 的 Promise 中出现未知异常的原因

c++ - Visual Studio 用户使用 GCC/make 的介绍

c++ - 如何从 shared_ptr 调用私有(private)析构函数?

c++ - 是否可以绑定(bind) lambda 函数的第二个参数?

c++ - C++ 会使用复制赋值运算符中的 move 构造函数吗?