はじめまして
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>" が何のために存在するのでしょうか。
基本的な問題ですいませんが
宜しくお願いします
template 構造体の不思議な定義法
Re:template 構造体の不思議な定義法
これはメタ関数というものです。
次のようにして使います。
#if 指令では、条件式に sizeof 演算子を使うことができませんが、テンプレート引数であれば、sizeof 演算子や列挙定数などを使うことができます。また、別のメタ関数の結果を使うこともできます。
> 基本的な問題ですいませんが
これはかなり高度な部類に入ります。
次のようにして使います。
Select<sizeof(int)==sizeof(long), int, long>::Result x;上の例では、int 型のサイズが long 型と同じであれば、x は int 型、そうでなければ long 型として宣言されます。
#if 指令では、条件式に sizeof 演算子を使うことができませんが、テンプレート引数であれば、sizeof 演算子や列挙定数などを使うことができます。また、別のメタ関数の結果を使うこともできます。
> 基本的な問題ですいませんが
これはかなり高度な部類に入ります。
Re:template 構造体の不思議な定義法
たかぎさん
ありがおうございます。
> Select<sizeof(int)==sizeof(long), int, long>::Result x;
この例って、例1と例2のどっちのためのでしょうか。
申し訳ありません。まだ理解できていないです。
ありがおうございます。
> Select<sizeof(int)==sizeof(long), int, long>::Result x;
この例って、例1と例2のどっちのためのでしょうか。
申し訳ありません。まだ理解できていないです。
Re:template 構造体の不思議な定義法
>> Select<sizeof(int)==sizeof(long), int, long>::Result x;
> この例って、例1と例2のどっちのためのでしょうか。
例1と例2の両方を定義しておいて,環境にあわせて型を決定するために使われます。
つまり,両方のための例になります。
sizeof(int)とsizeof(long)が同一の値をとる環境下では,例1の構造体が使われます。
sizeof(int)とsizeof(long)が異なる値をとる環境下では,例2の構造体が使われます。
> この例って、例1と例2のどっちのためのでしょうか。
例1と例2の両方を定義しておいて,環境にあわせて型を決定するために使われます。
つまり,両方のための例になります。
sizeof(int)とsizeof(long)が同一の値をとる環境下では,例1の構造体が使われます。
sizeof(int)とsizeof(long)が異なる値をとる環境下では,例2の構造体が使われます。