2017-02-05 39 views
5

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?

+9

Tamamlayıcı soru soracağım: neden bir üye işlevi olmalı? –

+7

[Tuple ile aynı] (https://stackoverflow.com/questions/3313479/stdtuple-get-member-function) kesinlikle. Sözdizimi çok çirkinleşiyor. –

cevap

6

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.

+1

Eh, doğru olarak ayrıştırmak için (v) 'almak için 'get' adlı bir işlev şablonuna ihtiyacınız vardır. Yine de, her seferinde 'şablon' yazmak zorunda kalmaktan daha iyidir. –

+0

@ 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 typename T :: uncallable get(); 'argümanların sayısı gerçekten önemli değil) tartışabilir. –