2012-02-06 3 views
2

http://www.boost.org/doc/libs/1_35_0/doc/html/boost/get_id405862.htmlboost :: getのパラメータ型を指定する必要があるのはなぜですか?

template<typename U, typename T1, typename T2, ..., typename TN> 
    U & get(variant<T1, T2, ..., TN> & operand); 

機能は、コンテンツが指定されたタイプUである場合にのみ成功します。

boost::getはテンプレート関数ですか?

ほとんどの場合、テンプレート関数を呼び出すと、関数自体がパラメータ型を推測できるため、手動で入力する必要はありません。

なぜこの場合、手動で入力する必要がありますか?テンプレート関数には戻り値の型を推定する方法がないので、戻り値の型の型を指定する必要がありますか?

boost::variant<int, std::string> my_first_variant; 

    my_first_variant = 10; 

    assert(boost::get<int>(my_first_variant) == 10) 
        ^
+2

"*テンプレート関数は戻り値の型を推論する方法がないので、戻り値の型を提供する必要がありますか?*"はい、まさにあなた自身の質問に答えました。 ; - ] – ildjarn

答えて

3

テンプレート関数は、戻り値の型を推定する方法がないように、我々は戻り値の型のためのタイプを提供する必要があるため、それか?

はい、コンパイル時に含まれる型を推測する方法はありません。 variantには実行時にT1, T2, ..., TNのいずれかが含まれています。

2

関数の戻り値タイプを推測することはできません。これは、指定する必要があるテンプレートパラメータの1つです。 boost::variantランタイムで変化するタイプの指定されたコレクションのいずれかを保持している間

はまた、テンプレートはコンパイル時コードジェネレータであることに注意してください。したがって、静的な概念ではないため、「現在の型を自動的に取り出す」のは意味がありません。

つまり、静的命令「get me type U」をコンパイルすると、その時点でのバリアントの現在の状態に応じて、実行時に呼び出しが成功するか失敗する可能性があります。

関連する問題