2016-11-06 40 views
0

我陷入困境,請幫我解決這個問題。執行檢測算法的通用接口

想法: 在不同的檢測算法(說圓,三角和矩形)之間有一個共同的接口。

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是的,我將有接口的實現(抽象類)

在此先感謝

+0

有解決這個問題許多方法。使用歧義的'union'是其中之一,使用一個通用的'std :: map '參數名稱作爲關鍵字是另一個。 –

+0

你能給我舉個例子嗎 – Barry

+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 
    };