第七報:自分色に染めて

 みなさん、ゴールデンウィークはいかがお過ごしでしょうか。実家に帰ってゆっくりする人、旅行に出かけている人、うちでごろごろしてる人、いろいろいると思いますが、日頃できないことを堪能できるチャンス、充分堪能しましょう。

 え? 「俺にはゴールデンウィークなんてない!」って? それは大変やね...。でも、いかにもプログラマらしい生活で、ちょっと憧れるかな(変)。いやいや、頑張ってください。


 今回も第五報に続いてVC++の機能についての話をしたいと思います。

 第五報で触れたオプションの「書式」ですが、その「ソースウィンドウ」カテゴリの「ユーザー定義キーワード」が今回のネタです。

 このユーザー定義キーワード、色を何に変えてみてもウィンドウに変化がないと思います。そもそもC/C++でいう「キーワード」というのは int や for や if などのような予約語のことで、「キーワード」の色を指定する場所もちゃんと用意されています。すると、ユーザー定義キーワードとは何者なんでしょうか?

 実はこのユーザー定義キーワードというのは特に予約語とは関係なくて、「好きな単語を自分で指定して、それに好きな色を付けられる」というものです。

 つまり、次のようなプログラムを...

// Usertype.cpp
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

template <typename t_Value>
    class CDispOne
{
private:
    ostream& m_ostr;
public:
    CDispOne(ostream& ostr) : m_ostr(ostr) {}
    void operator()(t_Value value){ m_ostr << value << ' '; }
};

template <typename t_Value>
    ostream& operator<<(ostream& ostr, vector<t_Value>& cont)
{
    ostr << "( ";
    for_each(cont.begin(), cont.end(), CDispOne<t_Value>(ostr));
    ostr << ')';
    return ostr;
}

class CGen
{
    int m_nCount;
public:
    CGen() : m_nCount(0) {}
    int operator()(){ return m_nCount++; }
};

int main()
{
    srand(static_cast<unsigned>(time(NULL)));

    const int nBufSize = 10;

    vector< int > a(nBufSize), b(nBufSize), c(nBufSize);

    generate(a.begin(), a.end(), CGen());
    copy(a.begin(), a.end(), b.begin());
    random_shuffle(b.begin(), b.end());
    transform(a.begin(), a.end(), b.begin(), c.begin(), minus< int >());
    cout << c << endl;

    return 0;
}

こんな風に...

// Usertype.cpp
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

template <typename t_Value>
    class CDispOne
{
private:
    ostream& m_ostr;
public:
    CDispOne(ostream& ostr) : m_ostr(ostr) {}
    void operator()(t_Value value){ m_ostr << value << ' '; }
};

template <typename t_Value>
    ostream& operator<<(ostream& ostr, vector<t_Value>& cont)
{
    ostr << "( ";
    for_each(cont.begin(), cont.end(), CDispOne<t_Value>(ostr));
    ostr << ')';
    return ostr;
}

class CGen
{
    int m_nCount;
public:
    CGen() : m_nCount(0) {}
    int operator()(){ return m_nCount++; }
};

int main()
{
    srand(static_cast<unsigned>(time(NULL)));

    const int nBufSize = 10;

    vector< int > a(nBufSize), b(nBufSize), c(nBufSize);

    generate(a.begin(), a.end(), CGen());
    copy(a.begin(), a.end(), b.begin());
    random_shuffle(b.begin(), b.end());
    transform(a.begin(), a.end(), b.begin(), c.begin(), minus< int >());
    cout << c << endl;

    return 0;
}

できるわけです。

 STLを沢山使うと、コードが真っ黒になって可読性が増してるのか減ってるのかサッパリ分からない状態になったりします(別にそれでも充分読みやすいという人もいるかも知れませんが)。そこを、ユーザー定義キーワードを使えばいくらか改善できるわけです(それでも読みにくいという人もいるかもしれませんが(汗))。


 では、肝腎の「ユーザー定義キーワードはどうやって指定するのか」を話そうと思います。

 これは簡単です。Msdev.exe(つまりはVC++)の置いてあるフォルダに USERTYPE.DAT というファイルを作ります。この中に書いた単語がユーザー定義キーワードとなります。単語の区切りは一応空白か改行ですが、1行のうち先頭の1つしかユーザー定義キーワードになりません。

 これのいまいち不便なところはVC++を再起動しないと有効にならないところですが、まぁそんなに頻繁に変えるもんでもないのでこんなもんでしょう。

 algorithm, fanctional, numeric 内の各関数、クラス、そして各標準クラステンプレート名、begin, end, rbegin, rend, 各 ios クラス名とそのオブジェクト、マニピュレータと BYTE などの型やマクロに numof, bit, unless, until, loop の5つを加えた USERTYPE.DAT を作ってみたので(これ)、あとはカスタマイズして好きに使ってください。こんなもんの著作権なんて100%放棄です。何か抜けてたら、意図的に抜かしたか、私の無知のなせる業です。

 では、このマイナーな機能「ユーザー定義キーワード」を有効に利用してやって下さい。折角作ってくれてるんだし。


目次に戻る

トップページに戻る

Last update was done on 2001.5.3