2016-09-06 98 views
2

我想寫一個通用接口。我需要一個std :: vector中不同對象的列表。這些對象中的每一個都有另一種類型但接口相同。不同類型的通用接口

例如:

struct Base 
{ 
    std::string name; 

    virtual void doWork(???, ???); 
    virtual void print(???,???); 
}; 

struct ObjA : Base 
{ 
    void doWork(???,???) override 
    { 
     std::cout << "Hello\n"; 
    }; 
    void print(???,???) override 
    { 
    std::cout << "Hey\n"; 
    }; 
} 

struct ObjB : Base 
{ 
void doWork(???,???) override { std::cout << "Hello\n"; }; 
void print(???,???) override { std::cout << "Hey\n"; }; 
} 

但我不知道???的類型,???。由於無法與模板結合使用虛擬化,因此我正在尋找一種優雅的方式。

是否有可能在編譯時解決這個問題?

+2

請至少提供一個預期用途的完全具體示例。現在(沒有這樣的例子)投票結束,因爲不清楚。 –

回答

1

你可以用變量參數做到這一點。 在Base中,傳遞要傳遞的參數數量的整數,然後傳遞可變參數。 然後使用va_arg獲取實際參數。

struct Base 
{ 
    std::string name; 

    virtual void doWork(int i, ...) 
    { 
    } 
}; 

struct ObjB : Base 
{ 
    void doWork(int i, ...) override 
    { 
     va_list ap; 

     va_start(ap, i); 

     int x = va_arg(ap, int); 

     std::cout << x << std::endl; 

     float f = va_arg(ap, float); 

     std::cout << x << std::endl; 

     va_end(ap); 
    } 
}; 

Base *base = new ObjB; 

base->doWork(2, 10, 3.f); 
0

您的未知參數類型(???)聞起來像他們還需要共享一個通用接口,以向您的方法提供任何有用的信息。

這將以優雅的方式解決問題,但顯然不是在編譯時。