저는 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-> ints, 1-> doubles라고하는 맵을 원합니다. 그런 식으로 래퍼에 값을 전달하면 다른 반환 값을 반환합니다. 당신은 단지 boost :: any를 가상 함수의 리턴 타입으로 사용할 수 있습니까? – dchhetri