SORU
7 Ocak 2013, PAZARTESİ


C 11/hepsi en belirleyici bir fonksiyon şablonları evrensel başvurular kabul olarak yazılmalıdır?

N üye değişkenleri olan bir sınıf X bazı her düşününcopiablevehareketliyazın ve N ilgili ayarlayıcı işlevleri. C 98, X tanımı muhtemelen bu gibi bir şey olacaktır:

class X
{
public:
    void set_a(A const& a) { _a = a; }
    void set_b(B const& b) { _b = b; }
    ...
private:
    A _a;
    B _b;
    ...
};

Sınıfın kurucu işlevleri X yukarıdaki bağlama lvalue ve rvalue bağımsız değişken için de yapabiliriz. Gerçek argümanın bağlı olarak, buolabilirgeçici yaratılmasına neden olabilirsonuçta kopya bir görev; bu nedenle, nedenolmayan copiablebu tür tasarım tarafından desteklenmiyor.

C 11 ile onları bu şekilde yeniden yazarak ayarlayıcı işlevleri daha verimli ve yaygın bir kullanım için izin hareket semantiği, mükemmel iletme ve evrensel referanslar (Scott Meyers terminolojisini), biz var:

class X
{
public:
    template<typename T>
    void set_a(T&& a) { _a = std::forward<T>(a); }

    template<typename T>
    void set_b(T&& b) { _b = std::forward<T>(b); }
    ...
private:
    A _a;
    B _b;
    ...
};

Evrensel referanslar olabilir bağlamak için const/olmayanconst, volatile/olmayanvolatile ve herhangi bir konvertibl yazın genel önleme yaratılış geçici ve geçen değerler düz operator =.Olmayan copiable,hareketlitürleri artık destekleniyor. Muhtemelen istenmeyen bağlantıları da std::enable_if static_assert veya ortadan kaldırılabilir.

Olarak . yani benim soru: ^em>kılavuz tasarımgereken tüm (diyelim, en yapalım) C 11 ayarlayıcı işlevleri işlev şablonları evrensel başvurular kabul etmek? olarak yazılması

Bu ayarlayıcı işlevleri kod yazarken Intellisense gibi yardımcı araçlar kullanarak daha hantal ve imkansızlığı sözdizimi dışında, varsayımsal ilkesi ile ilgili herhangi bir dezavantajları vardır "mümkün olduğunda işlev şablonları evrensel başvurular kabul ayarlayıcı işlevleri yazın"?

CEVAP
7 Ocak 2013, PAZARTESİ


Sınıfları ve B biliyorsun, eğer hareketli bir iş olup olmadığı ve eğer bu tasarım sonuçta gerekli eğer biliyorum. std::string gibi bir şey için zaman kaybı performans burada bir sorun var bildiğiniz sürece varolan kodu değişiyor. Eğer auto_ptr, ile uğraşıyorsanız ve unique_ptr söküp kullanmanın zamanı geldi.

Genellikle şimdi argümanları almak tercihdeğerdaha fazla bir şey olarak belirli - böyle bilmiyorum

void set_a(A a) { _a = std::move(a); }

Bu movability dışında herhangi bir şeye ihtiyacınız olmadan A kurucular herhangi birinin kullanımına izin verir ve nispeten kolay arayüz sunar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Helder Barreto

    Helder Barre

    22 Mayıs 2006
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013