2013-05-06 2 views
0

Я хочу сделать что-то подобное в C++ 11, но я не знаю, как это сделать или что делать с Google: Целью этого является эмулировать полиморфизм по типу возврата здесь, это образец код, чтобы объяснить, что я хочу сделатьC++ 11 template specialization wrapper

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-> ints, 1-> double и т. Д. Таким образом вы передаете значение в оболочку и возвращает другое возвращаемое значение? Можете ли вы просто использовать boost :: any как возвращаемый тип для виртуального funtion? – dchhetri

ответ

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

Смежные вопросы