Bir hafta önce, yalnızca bir sınıf şablonunu yalnızca belirli bir üye işlevine sahip olsaydı nasıl örneklendirebileceğimi soran bir soru sordum. Cevabımda, karmaşık bir çözüm buldum. Ama sonra kendi başıma yapmayı denedim. Ben sadece bu tür bir T
türünü anlamaya yetecek kadar 0 parametre alarak f
isimli bir fonksiyona sahip olup olmadığını bilmek istedim. this thread?Bu, SFINAE olarak kabul edilir mi?
cevap
Yep kadar komplike diğer cevaplar neden
#include <type_traits>
#include <utility>
template <typename T, typename = void>
struct has_f : std::false_type { };
template <typename T>
struct has_f<
T,
decltype(std::declval<T>().f(), void())> : std::true_type { };
template <typename T, typename = typename std::enable_if<has_f<T>::value>::type>
struct A { };
struct B
{
void f();
};
struct C { };
template class A<B>; // compiles
template class A<C>; // error: no type named ‘type’
// in ‘struct std::enable_if<false, void>’
Eğer öyleyse, sen C++ 11 SFINAE en basit, en deyimsel tarzda bunu çözdük.
Dönüş türünün void
olduğunu, nonstatik bir üye olduğunu ve hiçbir parametrenin olmadığını kontrol etmediğinizi unutmayın. f
, hiçbir argüman olmadan kolayca çağrılabilir. Bir functor bile olabilir.
void
dönen bir nullary üyesi nonstatic işlev için kontrol Evet, bu SFINAE olduğunu
template <typename T>
struct has_f<T, decltype(void(static_cast< void (T::*)(void) >(&T::f))) >
: std::true_type {};
template <typename T>
struct has_f<T, decltype(void(static_cast< void (T::*)(void) const >(&T::f))) >
: std::true_type {};
Yani ben dönüş tipi geçersiz olup olmadığını kontrol etmek için std :: result_of 'kullanın? –
@MemyselfandI Bu bir şekilde, 'decltype'ı da kullanabilirsiniz. std :: result_of' std :: bind' ve std :: function' tarafından kullanılan INVOKE konseptini desteklemek için biraz garip bir dans yapar. Birden fazla koşulu bir kerede kontrol etmenin hızlı bir yolu için düzenlememe bakın. Her durumda, ayrıca std :: is_same''e de ihtiyacınız olacak. – Potatoswatter
Sanırım std :: is_same
- 1. Türetilmiş sınıflar arkadaşlar olarak kabul edilir mi?
- 2. Mixin bir tasarım deseni olarak kabul edilir mi?
- 3. Uygulamayı etkinleştirmeden fare tıklamaları kabul edilir mi?
- 4. SFINAE?
- 5. Neden bu varsayılan kurucu olarak kabul edilmiyor?
- 6. SFINAE?
- 7. asmx xml alternatif olarak kabul edilebilir mi?
- 8. Simulink'te, Goto ve From blokları genellikle kötü bir stil olarak kabul edilir mi?
- 9. SQL Server 2008'de "0D0" sayısal olarak niçin kabul edilir?
- 10. Bu api dinlendirici mi?
- 11. TThread.Execute içinde sonsuz bir döngü koymak için kötü bir uygulama olarak kabul edilir mi?
- 12. Mercuri alt depoları neden son çare olarak kabul edilir
- 13. JSF neden MVP olarak kabul edilir, MVVM çerçevesi değil
- 14. C++, SFINAE
- 15. Bir nesnenin __init__ ifadesinde nasıl kabul edilir?
- 16. Haskell'in Text.JSON kullanımı çirkin olarak kabul edildi mi?
- 17. Bir şablon değeri parametresinde decltype, bir SFINAE bağlamını tetiklemeli mi?
- 18. Pytest fikstürüne geçirilen paramitler değişken olarak kabul edilebilir mi?
- 19. değişken şablon "SFINAE" çalışmıyor
- 20. Statik iddialar ve SFINAE
- 21. REST: HTTP 303 senkronize olmayan işlemler için zararlı kabul edilir mi?
- 22. Neden bu çalışır (Templates, SFINAE). C++ dünkü yazıya atıfta
- 23. std :: sfinae kullanarak hash uzmanlığı?
- 24. Mantıksal görünüm şablonlarında kabul edilebilir mi?
- 25. Bu değer (std :: atomic <tamsayı türü>) == sizeof (tamsayı türü) olarak garanti edilir mi?
- 26. Mozilla Thunderbird'de toplantı daveti nasıl okutulur/kabul edilir/reddedilir
- 27. T (x) bir döküm olarak kabul edilir mi? Ancak</p> <pre><code>int foo = (int) somefloat; </code></pre> <p>bu bir döküm kabul edilir: Aşağıdaki
- 28. Sınıf kurucusunda parametreye sahip kabul edilebilir mi?
- 29. Goroutines içinde goroutines başlatılması kabul edilebilir mi?
- 30. ActiveRecord'da .order yöntem parametreleri varsayılan olarak dezenfekte edilir mi?
kullanmak ve evet, bu doğrudur belirleyin. Diğer cevapların neden daha karmaşık olduğuna gelince ... söylemesi zor. –
'Has_f'ın kendisi SFINAE'ye güveniyor,' A' yazmıyor. –
Bir olasılık olarak, bazı derleyicilerde (* öksürük * MSVC2012) bazı derleyicilerde SFINAE desteği, daha karmaşık bir SFINAE'ye sahip olmak için bu karmaşıklığın bir kısmı olabilir. Bir kenara göre, std :: declval() .f() 've' std :: declval () .f() '(veya bu 'std :: declval () .f()'?) Bu özelliğe rvalue referansı nedeniyle C++ 1y'de farklı şeyler olabilir. –
Yakk