SORU
17 HAZİRAN 2011, Cuma


nasıl benim sınıf için takas fonksiyonu sağlamak için?

Benim STL algoritmaları swap etkinleştirmek için doğru yol nedir?

1) Üyesi swap. std::swap SFİNAE hüner üye swap kullanın.

2) dikili swap aynı ad.

3) std::swap Kısmi uzmanlaşma.

4) yukarıdakilerin Hepsi.

Teşekkür ederim.

EDİT: sorumu açıkça. ifade edemedim gibi Görünüyor Temel olarak, bir şablon Dersim var ve STL algos (etkin) takas yöntemini kullanmak için yazdım bu derse ihtiyacım var.

CEVAP
17 HAZİRAN 2011, Cuma


1) uygunkullanınswap. "Kütüphane" ve ADL (bağımlı değişken arama) *11.* etkinleştirmek istiyor kod yazarken böyle yazmak Ayrıca, bu SFİNAE ile bir ilgisi yok.

// some algorithm in your code
template<class T>
void foo(T& lhs, T& rhs){
  using std::swap; // enable 'std::swap' to be found
                   // if no other 'swap' is found through ADL
  // some code ...
  swap(lhs, rhs); // unqualified call, uses ADL and finds a fitting 'swap'
                  // or falls back on 'std::swap'
  // more code ...
}

2) sınıf swap bir işlevi sağlamak için uygun bir yoldur.

namespace Foo{

class Bar{}; // dummy

void swap(Bar& lhs, Bar& rhs){
  // ...
}

}

Eğer swap 1'de gösterildiği gibi, şimdi kullanılan) ise, fonksiyon bulunacak. Ayrıca, eğer mutlaka gerekiyorsa bir arkadaş işlev yapmak, ya da ücretsiz bir üye işlevi tarafından çağrılan swap sunabilirsiniz:

// version 1
class Bar{
public:
  friend void swap(Bar& lhs, Bar& rhs){
    // ....
  }
};

// version 2
class Bar{
public:
  void swap(Bar& other){
    // ...
  }
};

void swap(Bar& lhs, Bar& rhs){
  lhs.swap(rhs);
}

3) açık bir uzmanlaşma demek. Kısmi hala başka bir şey ve işlevler, yapılar / sınıflar için sadece mümkün değil aynı zamanda. Şablon sınıfları için std::swap, senin uzman olduğun için değil gibivarsenin ad özgür bir işlevi sağlamak. Eğer söylemem gerekirse kötü bir şey değil. Şimdi, açık bir uzmanlaşma da mümkündür, ama genellikle 20**:

namespace std
{  // only allowed to extend namespace std with specializations

template<> // specialization
void swap<Bar>(Bar& lhs, Bar& rhs){
  // ...
}

}

4) Hayır 1) 2 ayrıdır) ve 3). Ayrıca, 2) ve 3) her zaman 2 olmasına sebep olacak) daha iyi uyuyor çünkü aldı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Canal de arkyoru

    Canal de ark

    18 Ocak 2007
  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • Google Chrome

    Google Chrom

    1 EYLÜL 2008