Scott Meyers bir sonraki kitabı EC ++ 11'in içeriğini ve statüsünü yayınladı . Kitaptaki bir öğenin " std::enable_if
İşlev imzalarından kaçın" olabileceğini yazdı .
std::enable_if
işlevleri veya sınıfları aşırı yük çözünürlüğünden koşullu olarak kaldırmak için işlev bağımsız değişkeni, dönüş türü veya sınıf şablonu veya işlev şablonu parametresi olarak kullanılabilir.
Gelen bu soruya her üç çözüm gösterilmiştir.
Fonksiyon parametresi olarak:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Şablon parametresi olarak:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Dönüş türü olarak:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Hangi çözüm tercih edilmeli ve neden başkalarından kaçınmalıyım?
- Hangi durumlarda "
std::enable_if
İşlev imzalarından kaçın " , dönüş türü olarak kullanımla ilgilidir (normal işlev imzasının bir parçası değil, şablon uzmanlıklarının bir parçasıdır)? - Üye ve üye olmayan işlev şablonları için herhangi bir fark var mı?
std::enable_if
benim işlevi imzaları (özellikle çirkin ek yığılmayı için nullptr
her zaman bir şey bir için (ne olduğunu gibi garip kesmek göründüğünden fonksiyon argümanı versiyonu) static if
kudreti çok daha güzel ve temiz yapın) interresting dil özelliğini kullanmak için kara büyü kullanarak şablonu. Bu yüzden mümkün olduğunda etiket göndermeyi tercih ederim (iyi, hala ek garip argümanlarınız var, ancak genel arayüzde değil, aynı zamanda daha az çirkin ve şifreli ).
=0
içinde typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
başarmak? Bunu anlamak için doğru kaynakları bulamadım. Önce ilk kısmı biliyorum =0
üyesi türüne sahip int
olmadığını U
ve int
aynıdır. Çok teşekkürler!