我陷入困境,请帮助我解决这个问题。
思想: 在不同的检测算法(Say Circle,Triangle和Rectangle)之间有一个共同的接口。
class IDetectionInterface()
{
public:
virtual void PerformDetection(Image & InputImage, DetectionStruct & DetectionData, DetectionParam & DetParam) = 0;
virtual ~IDetectionInterface()
{
}
};
其中图片和 DetectionStruct 是如下结构:
struct Image
{
unsigned char * pImageData;
int Width;
int Height;
};
struct DetectionStruct
{
Rect BoundingBox;
DectionType DetType;
};
struct Rect
{
int x;
int y;
int width;
int height;
};
enum DectionType
{
Circle = 0,
Triangle = 1,
Rectangle = 2
}
对我而言,问题在于DetectionParam,因为检测算法的参数不同。比如说
struct RectDetectionParam
{
int param1;
float param2;
double param3;
};
struct TriDetectionParam
{
float param1;
float param2;
double param3;
int param4;
};
struct CirDetectionParam
{
int param1;
float param2;
bool param3;
int param4;
float param5;
};
如何将此功能发送到上面的通用界面。
注意:我不想将所有参数放在一个结构中,这是最简单的解决方案,但是如果我改变算法然后它的各自参数发生变化就会有它的缺点,我们需要再次重新编写结构
和Ofcource是的,我将实现接口(Abstract class)
提前致谢
答案 0 :(得分:0)
根据您的示例,您可以创建一个区分联合以使参数集通用:
struct DetectionParams {
DectionType detectionType; // Discriminator
union {
RectDetectionParam rectDect;
TriDetectionParam triDect;
CirDetectionParam cirDect;
};
};
在实现中使用哪个联合部分由鉴别器确定。
另一种方法是使用基于唯一参数名称(键字符串)的参数集:
struct DetectionParams {
std::map<std::string,std::any> params; // Note that std::any is available
// at the not yet official c++17 standard
};