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;
}
実装の解説は他サイトで。(投)

2012年10月10日水曜日

boost::lexical_castもどき

ネタがないので実装した(嘘実装です。すみません。)
#include<sstream>

template<class Ret, class Arg>
Ret lexical_cast(Arg arg){
    Ret ret;
    std::stringstream ss;
    ss << arg;
    ss >> ret;
    return ret;
}
3の倍数と3のつく数字だけあほになるプログラム(古い。。。)
#include<iostream>
#include<string>
#include"lexical_cast.hpp"
using namespace std;

int main(){
    for(int i = 0;i < 100;i++){
        if(i % 3 == 0 || lexical_cast<string>(i).find('3') != string::npos) cout << "あほ" << endl;
        else cout << i << endl;
    }
    return 0;
}

2012年10月8日月曜日

2次元版bitset

stlのbitsetの2次元版がほしくなったので実装した。
#pragma once

#include<bitset>

template<size_t X, size_t Y>
class bitset2d : public std::bitset<X * Y>{
private:
 typedef std::bitset<X * Y> base;
public:
 bitset2d(){}
 
 base& set(size_t x, size_t y, int val){
  return base::set(X * y + x, val);
 }
 
 bool at(size_t x, size_t y){
  return base::at(X * y + x);
 }
 
 reference& operator()(size_t x, size_t y){
  return base::operator[](X * y + x);
 }
};
簡単な使い方
bitset2d<10, 20> bits; //10 * 20のbitsetを作る
bits.set(2, 4, 1) //(2, 4)に1をセット
cout << bits.at(2, 4) << endl;
bits(5, 5) = 1; //[]の代わり

2012年10月7日日曜日

ブログ名

最初の投稿はブログ名の由来を書こうと思います。
public object express();は気づいた人もいるかと思いますが、C#などのメソッドです。publicは外に広く、object(クラス型の基底)は(技術的なことを)何でも、expressは表現するという意味を込めています。
自分はプログラミングが好きで、高専に入りました。しかし、同じプログラミング好きは少なく、あまり互いに磨きあうという意識はありませんでした。
ネットとかを見ているとプログラミング好きの高校生は結構いることを知りました。そこで今の自分は内向きであることを自覚しました。そこで自分を外に表現して、技術を磨きたいと思って、このブログを始めました。
技術的(プログラミング、マイコンなどのハード)なことを書いていこうと思っています。よろしくお願いします。