【发布时间】:2014-09-16 06:38:19
【问题描述】:
我尝试在相当大的旧 c++ 项目中简化 c++ 代码,解决以下简单示例将帮助我将模式应用于我使用的代码。代码很大,我把它简化为核心问题。
我想编写 c++ 模板代码,它可以在编译时根据参数(例如枚举)推断模板类型。在我当前的代码中,我必须手动编写模板类型
GetSignal<int*>(Signals::Clear)
这很容易出错。我想实现 SomeMagicNeedToBeHere 以引起预期的行为。
enum Signals{ Clear, Filtered};
template <class DATA> class ContainerClass
: public SomeMagicNeedToBeHere<int*,Signals::Clear>,
public SomeMagicNeedToBeHere<float*,Signals::Filtered>
{
void DoSomething()
{
//auto == int*
auto clear = GetSignal(Signals::Clear);
//auto == float*
auto filtered = GetSignal(Signals::Filtered);
}
};
是否可以根据参数值推断类型以及如何推断?
更新(重写示例):
我检查了旧代码,但我的示例不正确,没有用于推断类型的基类。我已将水果更改为 int 和 float 以便更好地理解。
【问题讨论】:
-
您可以根据参数值推断模板,但只能在编译时进行。也许您可以在您的要求中添加更多细节。
-
为什么不只是有一个
GetFruit函数,它返回一个FruitBase指针,并根据简单的if或switch声明?不要让事情过于复杂。 -
我现在的情况就是这样,但是需要手动投。
-
如果
FruitBase包含在子类中被覆盖的正确虚拟成员函数,为什么需要强制转换?似乎我们有一个the XY problem 的案例,您告诉我们您需要帮助解决的解决方案,但您并没有真正告诉我们您要解决什么问题。您的问题可能还有其他解决方案。 -
GetSignal是什么?
标签: c++ templates type-deduction