C++ 17'nin std::get<T>
nolu nedeninin global bir işlev olduğunu ve variant<...>
üye-işlevinin bir üyesi olmadığını söyleyen var mı?Neden std :: variant` global işlevi için <T> olsun?
cevap
get<T>()
, üye bir işlev şablonuysa, bağımlı bir bağlamda çağrıldığında, bir template
anahtar sözcüğü gerekir. Örneğin:
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
}
Hatta bir using
beyannamesi veya std::variant<...>
ve get()
hem de bulursa direktifi get()
olmadan ad std
bildirilmiştir. Bu nedenle, küresel fonksiyonun kullanımı daha kolay olduğu için, bir üye işlevi yapmak için iyi bir neden olmadığı görülmektedir.
Eh, doğru olarak ayrıştırmak için
@ T.C .: iyi nokta - şablon parametresi ile doğrudan ADL ile bulunmuyor. Bu, global kapsamda beyan edilen bir kalibre edilemeyen işlev şablonunun (ör., 'Template
Tamamlayıcı soru soracağım: neden bir üye işlevi olmalı? –
[Tuple ile aynı] (https://stackoverflow.com/questions/3313479/stdtuple-get-member-function) kesinlikle. Sözdizimi çok çirkinleşiyor. –