2017-02-05 7 views
5

C++のstd::get<T>がグローバル関数で、variant<...>のメンバー関数ではない理由を教えてもらえますか?なぜstd :: <T>は `variant`にグローバル関数を与えますか?

+9

私は補足的な質問をします:なぜそれがメンバー機能でなければならないのでしょうか? –

+7

[タプルと同じ](https://stackoverflow.com/questions/3313479/stdtuple-get-member-function)最も確実です。構文はあまりにも醜い取得します。 –

答えて

6

get<T>()がメンバー関数テンプレートの場合は、従属コンテキストで呼び出されるときにtemplateキーワードが必要になります。たとえば:でもusing宣言またはディレクティブget()なし

template <typename Variant> 
void f(Variant const& v) { 
    auto x0 = v.template get<T>(); // if it were a member 
    auto x1 = get<T>(v);   // using a non-member function 
} 

std::variant<...>get()両方として見つかった場合は、名前空間stdで宣言されています。したがって、グローバル関数が使い易いため、メンバ関数とする正当な理由はないようです。

+1

さて、 'get (v)'が正確に解析されるためには、スコープ内に 'get'という名前の関数テンプレートが必要です。それでも、毎回 'template'を書く必要がありません。 –

+0

@ T.C .:良い点 - テンプレートパラメータでは、ADLを介して直接見つけられません。それはグローバルスコープで宣言されている、呼び出し可能でない関数テンプレート(例えば 'template typename T :: uncallable get();';引数の数は本当に重要ではありません...)を論じるかもしれません。 –

関連する問題