2017-02-05 37 views
5

Czy ktoś może mi powiedzieć, dlaczego std::get<T> z C++ 17 jest funkcją globalną, a nie funkcją-członkiem variant<...>?Dlaczego std :: get <T> dla "wariantu" jest funkcją globalną?

+9

Zadam uzupełniające się pytanie: dlaczego ma pełnić funkcję członka? –

+7

[Tak samo jak w przypadku tuple] (https://stackoverflow.com/questions/3313479/stdtuple-get-member-function) z całą pewnością. Składnia staje się zbyt brzydka. –

Odpowiedz

6

Jeśli get<T>() był szablonem funkcji członka, wymagane jest słowo kluczowe template, gdy zostanie wywołane w kontekście zależnym. Na przykład:

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 
} 

Nawet bez wypowiedzenia using lub dyrektywy get() jeśli stwierdzono zarówno std::variant<...> i get() deklarowane są w przestrzeni nazw std. W związku z tym wydaje się, że nie ma żadnego powodu, aby uczynić go członkiem, ponieważ funkcja globalna jest łatwiejsza w użyciu.

+1

Potrzebny jest szablon funkcji o nazwie 'get' w zakresie, aby' get (v) 'został poprawnie przeanalizowany. Mimo to, lepiej niż pisać "szablon" na każdym kroku. –

+0

@ T.C .: dobry punkt - przy parametrze szablonu nie można go znaleźć bezpośrednio przez ADL. Może to być argumentem, że deklarowany szablon funkcji jest dublowany w zasięgu globalnym (np. Szablon nazwa_typu T :: uncallable get(); '; liczba argumentów nie ma znaczenia ...). –