プログラムTIPS

DEMO PROGRAM ヘキサドライブでは様々な研究開発をしています。その一部を紹介。

Type Traits(型特性)(2013年11月28日)

今日は、最近はまっている”C++のテンプレート”についてお話したいと思います。

 

標準C++ライブラリのvectorやlistなどでテンプレートを使ったことのある方も多いと思いますが、
実は、テンプレートを駆使するとコンパイル時にいろいろと特殊なことができます。
なかでも面白いのが、コンパイル時に型の特性を判断するというものです。

簡単な例として

以下のようにプログラムすると、型がポインタ型かどうか判別できます。
(注)ここでテンプレートの部分特殊化という機能を用いています。
詳しくは http://www.geocities.jp/ky_webid/cpp/language/037.html

#include <stdio.h>

template<typename T>
struct IsPointer
{
    static const bool value = false;
};

// 部分特殊化
template<typename T>
struct IsPointer<T*>
{
    static const bool value = true;
};

int main()
{
    printf("int is %s pointer.\n", IsPointer<int>::value ? "" : "not");
    printf("int* is %s pointer.\n", IsPointer<int*>::value ? "" : "not");
    return 0;
}

上記のような型の特性を調べるテンプレートを組み合わせることで、
コンパイル時に型の継承関係などを調べることができます。

このようなテンプレートの使い方に関しては
“C++テンプレートテクニック”という本がコンパクトにまとまりつつも、深くまで踏み込んでいてお勧めです。

http://www.amazon.co.jp/dp/4797354534

うーん。テンプレートの世界は奥が深いなぁ。

【免責事項】

本サイトが提供している情報に関しては、安全性等、いかなる保証もされません。 株式会社ヘキサドライブは、これらの情報をあなたが利用することによって生ずるいかなる損害に対しても一切責任を負いません。

【著作権】

本サイトが提供しているコンテンツについては、特に断りのある場合を除き、株式会社ヘキサドライブが著作権を有します。