【发布时间】:2021-09-13 14:16:25
【问题描述】:
我正在尝试重构一些代码。基本上是一个基于枚举的状态机。 有很多 switch 语句和函数以不同的名称和歧义被调用。
由于他们强迫我保留枚举,我想使用模板重构它。基本上我想使用模板来实现多态性。由于状态有限,应该有一种方法,但我找不到最好的方法。
#include <iostream>
enum class AnimalType
{
Dog,
Cat
};
template<AnimalType T>
void Foo()
{
std::cout << "Unknown animal\n";
}
template<>
void Foo<AnimalType::Dog>()
{
std::cout << "I'm a dog\n";
}
template<>
void Foo<AnimalType::Cat>()
{
std::cout << "I'm a cat\n";
}
int main()
{
AnimalType CurrentAnimal = AnimalType::Dog;
// Foo<CurrentAnimal>(); Won't compile
return 0;
}
【问题讨论】:
-
改用Tag dispatch?
-
如果您需要运行时调度,那么此解决方案可能会稍微简化问题,但无法解决问题。考虑类似
std::map<AnimalType, std::function<void()>>或类似的东西。您一定需要某种类型的对象,可以将值映射到特定函数。如果有运行时组件,您不能完全依赖编译器功能,例如模板或重载解析。