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ą?
Odpowiedz
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.
Potrzebny jest szablon funkcji o nazwie 'get' w zakresie, aby' get
@ 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
Zadam uzupełniające się pytanie: dlaczego ma pełnić funkcję członka? –
[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. –