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
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ı.
Nasıl gıt iptalleri için benim tercihi...
Nasıl pi benim hesaplama doğru olup ol...
Nasıl bir dize olarak adını aldığımda ...
Nasıl benim zorlamak için .NET Windows...
Nasıl gcc benim C çöker app bir stackt...