2013-05-06 4 views
0

저는 C++ 11에서 이와 같은 작업을하고 싶습니다.하지만 Google에 무엇을해야할지 모르겠습니다. 반환 유형에 다형성을 에뮬레이트하는 것이 목표입니다. 코드는 내가하고 싶은 것을 설명하기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-> ints, 1-> doubles라고하는 맵을 원합니다. 그런 식으로 래퍼에 값을 전달하면 다른 반환 값을 반환합니다. 당신은 단지 boost :: any를 가상 함수의 리턴 타입으로 사용할 수 있습니까? – 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