2013-05-06 77 views
0

我想在C++ 11中做這樣的事情,但我不知道該怎麼做或谷歌: 這個目標是模擬返回類型的多態性這裏是一個示例代碼解釋什麼是我想要做的C++ 11模板專業化包裝

enum foo : int 
{ 
    bar = 1, 
    baz = 2 
}; 

class Common 
{ 
public: 
    Common(){} 
    ~Common(){} 
    foo _val; 
}; 

class A : public Common 
{ 
    A() :_val(foo::bar){} 
    virtual ~A(){} 
    int func(){return 0;} 
}; 

class B : public Common 
{ 
    B() :_val(foo::baz){} 
    ~B(){} 
    double func(){return 60.55;} 
}; 

template <foo V> 
auto wrapper(Common * val) 
{ 
    return wrapper<V>(val); 
} 
template <foo::bar> 
A * wrapper(Common * val) 
{ 
    return (A*)val; 
} 

template <foo::baz> 
A * wrapper(Common * val) 
{ 
    return (B*)val; 
} 

void leFunc(Common * t) 
{ 
    auto val = wrapper<t::_val>(&t)->func(); 
} 

int main() 
{ 
    std::list<Common *> lst = {new A, new B}; 
    for (auto & e : lst) 
     leFunc(e); 
} 

編輯: 什麼,我想要做一些實際的例子: 的想法是有這樣的電話:

int i = wrapper<1>(myInterface &); 
double k = wrapper<2>(myInterface &); 
std::list<float> i = wrapper<3>(myInterface &); 

與存儲的模板特殊化在界面(值) 編輯代碼更精確

+0

好吧,我明白了,所以你只是想要一種地圖說0->整數,1->雙打等等。那樣你將一個值傳遞給包裝器並返回一個不同的返回值?你可以使用boost :: any作爲虛擬函數的返回類型嗎? – dchhetri 2013-05-06 19:25:24

回答

0

我不確定你到底想要什麼。也許像this。以下是src。

#include <iostream> 
using namespace std; 


enum Gender{ 
    MALE = 1, FEMALE = 2, UNKNOWN = 3 
}; 


template <Gender genderValue> 
struct CommonPerson{ 
virtual Gender getGender()const{ return genderValue; } 
virtual ~CommonPerson(){}; 
}; 

struct Male: public CommonPerson<MALE>{}; 
struct Female: public CommonPerson<FEMALE>{}; 

string toString(const Gender& g){ 
if(g == MALE) return "MALE"; 
else return "FEMALE"; 
} 
template<typename T> 
void printGender(const T& person){ 
std::cout << toString(person.getGender()) << endl; 
} 
int main(){ 
Male male; 
Female female; 
printGender(male); 
printGender(female); 
return 0; 
} 
+0

是的,感謝我測試這個解決方案。 我編輯我的帖子是爲了更明確我想做什麼 – user2355697 2013-05-06 19:32:55