我想知道什麼是以下方案的良好設計模式。三個問題: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;
}
[Template specialization](http://www.cprogramming.com/tutorial/template_specialization.html)? –
只是爲了能夠將A和B存儲在一個向量中,Container <>'的目的是什麼?或者目的是什麼? – sp2danny