gpt4 book ai didi

c++ - 使用模板而不是开关

转载 作者:可可西里 更新时间:2023-11-01 17:18:02 25 4
gpt4 key购买 nike

我想在我的代码中执行一组类似但仅根据参数变化的测试。

我可以使用 switch 语句来编写:

bool doTest(EnumSensorFamily family, const StructSensorProposal& proposed)
{
switch (family)
{
case FAM1:
return (ExpectedFam1 == proposed.Fam1SensorId);
break;
case FAM2:
return (ExpectedFam2 == proposed.Fam2SensorId);
break;
case FAM3:
return (ExpectedFam3 == proposed.Fam3SensorId);
break;
default:
ERROR ("Unexpected family");
return false;
}
}

我正在考虑使用模板特化来做到这一点

template <EnumSensorFamily family>
bool doTest(const StructSensorProposal& proposed);

template<>
bool doTest<FAM1> (const StructSensorProposal& proposed)
{
return (ExpectedFam1 == proposed.Fam1SensorId);
}

template<>
bool doTest<FAM2> (const StructSensorProposal& proposed)
{
return (ExpectedFam2 == proposed.Fam2SensorId);
}

template<>
bool doTest<FAM3> (const StructSensorProposal& proposed)
{
return (ExpectedFam3 == proposed.Fam3SensorId);
}

除了避免包含几乎相同情况的 switch 语句之外,这样做还有什么好处吗?

理想情况下,我希望能够编写单个方法来减少维护开销。

谢谢

最佳答案

建立安德鲁的回答...

请注意,EnumSensorFamily 系列 必须在编译时已知。如果直到运行时才知道,那么您必须编写一个 switch 来选择模板,让您回到起点。

另一种方法是使用 Traits 模式:

template <EnumSensorFamily family>
struct SensorTraits;

template <>
struct SensorTraits<FAM1>
{
const EnumSensorFamily kFamilyID = ExpectedFam1;
};

template <>
struct SensorTraits<FAM2>
{
const EnumSensorFamily kFamilyID = ExpectedFam2;
};

template <>
struct SensorTraits<FAM3>
{
const EnumSensorFamily kFamilyID = ExpectedFam3;
};

template <EnumSensorFamily family>
bool doTest(const StructSensorProposal& proposed)
{
return (SensorTraits<family>::kFamilyID == proposed.Fam1SensorId);
}

如果您尝试将 doTest 与缺少特征特化的传感器系列一起使用,则会出现编译错误。另请注意,您永远不会实例化 traits 对象,您只是使用它的定义。

这让您可以在多个函数中重用常量、typedef 等。此外,添加一个新系列并不涉及梳理所有代码以查找每个关心的 switch 语句。您所要做的就是创建一个新的 SensorTraits 特化。

编辑:您可以使用 pointer to member 使字段依赖于传感器系列:

template <>
struct SensorTraits<FAM1>
{
const EnumSensorFamily kFamilyID = ExpectedFam1;
int StructSensorProposal::*proposalField = &StructSensorProposal::fam1field;
};

// ...

template <EnumSensorFamily family>
int getProposedField(const StructSensorProposal& proposed)
{
return proposed.*SensorTraits<family>::proposalField;
}

例如,您还可以为传感器的数据类型输入 typedef:

template <>
struct SensorTraits<FAM1>
{
const EnumSensorFamily kFamilyID = ExpectedFam1;
typedef uint16_t data_type;
data_type StructSensorProposal::*proposalField = &StructSensorProposal::fam1field;
};

// ...

template <EnumSensorFamily family>
SensorTraits<family>::data_type getProposedField(const StructSensorProposal& proposed)
{
return proposed.*SensorTraits<family>::proposalField;
}

我还没有测试过这些;你可能需要一个 conststatic

关于c++ - 使用模板而不是开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com