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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
新芽

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

#1

投稿記事 by 新芽 » 18年前

はじめまして

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 構造体の不思議な定義法

#2

投稿記事 by たかぎ » 18年前

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

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

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

新芽

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

#3

投稿記事 by 新芽 » 18年前

たかぎさん
ありがおうございます。

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

YuO

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

#4

投稿記事 by YuO » 18年前

>> 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 構造体の不思議な定義法(お礼)

#5

投稿記事 by 新芽 » 18年前

あーッ、そうなの!
よくわかりました。
ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る