我尝试在相当大的旧c ++项目中简化c ++代码解决以下简单示例将帮助我将模式应用于我使用的代码。代码非常大我把它简化为核心问题。
我想编写c ++模板代码,它可以根据参数(例如enum)在编译时推断出模板类型。在我目前的代码中,我必须手工编写模板类型
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);
}
};
可以根据参数值以及如何推断出类型?
UPDATE(重写示例):
我检查了旧代码并且我的示例不正确,没有基类用于输入的类型。我已将水果改为int并浮动以便更好地理解。
答案 0 :(得分:2)
以下内容可能有所帮助:
// helper to get some type depending of signal
template <Signals sig> struct helper;
// specialization for each Signal to get type
template <>
struct helper<Clear>
{
using type = int*;
};
template <>
struct helper<Filtered>
{
using type = float*;
};
// And you may do similar stuff with function (and be generic if the type helper is enough)
template <Signals sig>
typename helper<sig>::type GetSignal()
{
return nullptr;
}