ページ 11

template 構造体の不思議な定義法

Posted: 2007年10月26日(金) 09:14
by 新芽
はじめまして

template技術を勉強しようとしましたが、早くも怪奇例文(構造体定義)に遭遇しました。

例1:
template <bool flag, typename T, typename U>
struct Select
{
typedef T Result;
};


この定義の中に"bool flag" と"typename U"が何のために存在するのでしょうか。

例2:
template <typename T, typename U>
struct Select<false, T, U>
{
t ypedef U Result;
};

この定義の中に"<false, T, U>" が何のために存在するのでしょうか。

基本的な問題ですいませんが
宜しくお願いします

Re:template 構造体の不思議な定義法

Posted: 2007年10月26日(金) 13:11
by たかぎ
これはメタ関数というものです。
次のようにして使います。
Select<sizeof(int)==sizeof(long), int, long>::Result x;
上の例では、int 型のサイズが long 型と同じであれば、x は int 型、そうでなければ long 型として宣言されます。
#if 指令では、条件式に sizeof 演算子を使うことができませんが、テンプレート引数であれば、sizeof 演算子や列挙定数などを使うことができます。また、別のメタ関数の結果を使うこともできます。

> 基本的な問題ですいませんが

これはかなり高度な部類に入ります。

Re:template 構造体の不思議な定義法

Posted: 2007年10月29日(月) 13:56
by 新芽
たかぎさん
ありがおうございます。

> Select<sizeof(int)==sizeof(long), int, long>::Result x;
この例って、例1と例2のどっちのためのでしょうか。
申し訳ありません。まだ理解できていないです。

Re:template 構造体の不思議な定義法

Posted: 2007年10月29日(月) 15:20
by YuO
>> Select<sizeof(int)==sizeof(long), int, long>::Result x;
> この例って、例1と例2のどっちのためのでしょうか。

例1と例2の両方を定義しておいて,環境にあわせて型を決定するために使われます。
つまり,両方のための例になります。

sizeof(int)とsizeof(long)が同一の値をとる環境下では,例1の構造体が使われます。
sizeof(int)とsizeof(long)が異なる値をとる環境下では,例2の構造体が使われます。

Re:template 構造体の不思議な定義法(お礼)

Posted: 2007年10月29日(月) 15:36
by 新芽
あーッ、そうなの!
よくわかりました。
ありがとうございました