[英]c++11 template specialisation wrapper
我想在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 &);
使用存储在界面中的模板特化(值)编辑代码以更精确
我不确定您到底想要什么。 也许像这样 。 下面是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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.