【发布时间】:2015-08-18 21:19:18
【问题描述】:
我已经使用 C++ 几年了,但我还没有找到解决我经常遇到的问题的方法。知道如何解决它会很棒。
我现在拥有的是:
// Client code:
switch(currentEnumValue)
{
case MyEnum::kValue01:
processData<MyEnum::kValue01>(data);
break;
case MyEnum::kValue02:
processData<MyEnum::kValue02>(data);
break;
default:
LOG("Invalid command");
break;
}
// Declarations
enum class MyEnum {kValue01, kValue02};
class MyClass
{
// code
template <MyEnum> void processData(char*); /* Implemented somewhere else */
}
template <> void MyClass::processData<MyEnum::kValue01>(char* data); /* Implemented somewhere else */
MyClass <> void MyClass::processData<MyEnum::kValue02>(char* data); /* Implemented somewhere else */
出于多种原因,我想移除开关。而不是它,我需要类似:processData<runtime-decltype(currentEnumValue)>(data);
我知道 typeid 以及不将编译时间和运行时混合在一起......但尽管如此,我还是想找到一些解决方案,最好排除宏。
【问题讨论】:
-
切换到动态多态呢?使用抽象接口(具有纯虚拟
processData()函数的类)和各种实现。 -
我也在寻找避免动态多态性的方法,我忘记写了。无论如何感谢您的提示(只需要最大可能的性能)
-
这些不是反问句,它们决定了我能想到的几种解决方案中的哪一种最好。 1)为什么需要枚举作为编译时间常数? 2) 交换机的哪些特性确切地有问题? “几个问题”含糊不清。请区分must和like。 3) 枚举值是否从零开始,并且是连续的? 4) 你提出的解决方案究竟“需要”什么?请避免过度指定:“必须”要求过多的答案可能是“不,你不能”。
-
好点,好的,我会尝试回答:1)我可能没有理解这个问题,枚举不是编译时间常数?无论如何,在这种特定情况下,我将这些枚举用于许多事情,并且我需要知道它们的值,因为我必须在数据包中通过网络将其传递 2)有问题,因为我想避免编写该开关代码,尤其是在需要时几次(我可以考虑在最后一个问题中使用模板模板参数,但我需要使用类)
-
您所描述的只是虚拟功能的手动实现版本。您对此有何反对意见?
标签: c++ templates types switch-statement runtime