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_ifbenim işlevi imzaları (özellikle çirkin ek yığılmayı için nullptrher zaman bir şey bir için (ne olduğunu gibi garip kesmek göründüğünden fonksiyon argümanı versiyonu) static ifkudreti ç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 ).
=0içinde typename std::enable_if<std::is_same<U, int>::value, int>::type = 0başarmak? Bunu anlamak için doğru kaynakları bulamadım. Önce ilk kısmı biliyorum =0üyesi türüne sahip intolmadığını Uve intaynıdır. Çok teşekkürler!