SyntaxHighlighter

StackEdit CSS

2012年10月11日木曜日

なんでもかんでも

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 件のコメント:

コメントを投稿