2015-04-14 74 views
0

我想知道什麼是以下方案的良好設計模式。三個問題:C++調用具有不同簽名的函數,具體取決於類型

1)我有一個模板化的「容器」類的「派生」的子類。我希望能夠將不同類型的模板對象(類型A或B,派生的兩個子類)存儲在向量中。這個怎麼做?

2)我有一個特定於模板的函數「func」,它對Containers進行操作並具有可變數量的參數,具體取決於Container的模板類型是A還是B.運行時調用適當的函數?

3)模板甚至對這個用例有意義嗎?

#include <iostream> 
#include <string> 
#include <vector> 
#include <memory> 

using namespace std; 

struct Derived {}; 

struct A : Derived { 
    int x; 
    A(int x) : x(x) {} 
}; 
struct B : Derived { 
    bool y; 
    B(bool y) : y(y) {} 
}; 

template <typename T> 
struct Container 
{ 
    T item; 
    Container(T i) : item(i) {} 
}; 

// definition of a template function for type a, with specialization 
void func(Container<A> c, int a, int b) { 
    cout << "update for A called" << endl; 
} 

void func(Container<B> c, bool x) { 
    cout << "update for B called" << endl; 
} 

int main(int argc, char const *argv[]) 
{ 
    Container<A> * foo = new Container<A>(A(1)); 
    Container<B> * bar = new Container<B>(B(true)); 
    // test that func() works 
    func(*foo,1,2); 
    func(*bar,false); 

    vector< Container<Derived>* > vec; 

    // this does not work 
    vec.push_back(unique_ptr< Container<Derived *> >(foo)); 
    vec.push_back(unique_ptr< Container<Derived *> >(bar)); 

    for (Container<Derived>* d : vec) { 
     // how to call the proper func(d)? 
    } 
    return 0; 
} 
+2

[Template specialization](http://www.cprogramming.com/tutorial/template_specialization.html)? –

+0

只是爲了能夠將A和B存儲在一個向量中,Container <>'的目的是什麼?或者目的是什麼? – sp2danny

回答

1

1)可以在一個指針std::vector<Derived *>存儲A(類型A *)或指針B(類型B *),因爲Derived對於兩個AB鹼。因爲它們之間沒有繼承關係,所以不可能將Container<A>Container<B>存儲到同一個向量中。這也是(間接)因爲您的編譯器拒絕將foobar轉換爲unique_ptr<Container<Derived *> >而被拒絕的原因。 2)你的func()不是「模板特定的函數」。它甚至不是模板化的功能。它是一個重載的函數,一個變體接受兩個參數,一個變體接受三個參數。

3)鑑於你的代碼是無效的,所以不可能推斷出你的用例是什麼。考慮到你試圖將對象轉換爲不相關的類型,我的猜測是你的用例在C++中沒有意義,更不用說使用模板了。另外,不要在C++中使用Java(或其他語言)技術,因爲它們的工作方式不同。特別;

Container<A> * foo = new Container<A>(A(1)); 
Container<B> * bar = new Container<B>(B(true)); 
func(*foo,1,2); 
func(*bar,false); 

是不必要的。由於在C++中無效的各種原因在Java中使用它,即使代碼編譯。相反,做到這一點;

Container<A> foo A(1); 
Container<B> bar B(true); 
func(foo,1,2); 
func(bar,false); 

這是有效和安全的C++(並不會在Java中工作,但這是另一回事)。

相關問題