boost::anyを実装してみた。boost::anyとは名前の通りなんでも入れられる型だ。これを知った時すごいなと思って調べると、タネは意外とあっさりだった。
#pragma once
#include<memory>
class holder_base{
public:
};
template<class T>
class holder : public holder_base{
public:
holder(const T &val) : mVal(val){}
T& getVal(){ return mVal; }
private:
T mVal;
};
class any{
public:
template<class T>
any& operator=(const T &val){
mHolder.reset(new holder<T>(val));
return *this;
}
template<class T>
operator T&(){
return reinterpret_cast<holder<T>*>(mHolder.get())->getVal();
}
private:
std::auto_ptr<holder_base> mHolder;
};
サンプルコード
#include<iostream>
#include<string>
#include"any.hpp"
using namespace std;
class Point{
public:
int x;
int y;
Point(int ax, int ay) : x(ax), y(ay){}
void show(){
cout << "x => " << x << ", y => " << y << endl;
}
};
int main(){
any val;
//数字だって
val = 5;
cout << static_cast<int>(val) << endl;
//文字列だって
val = string("Hello!");
cout << static_cast<string>(val) << endl;
//独自のクラスもいける
val = Point(10, 20);
static_cast<Point>(val).show();
return 0;
}
実装の解説は他サイトで。(投)
0 件のコメント:
コメントを投稿