2016-06-08 13 views
5

Bunun çok dikkat çekici bir soru olmadığını biliyorum. Birini diğerinin kullanmanın bir avantajı (derleme zamanı, bağımlılıklar, hata ayıklama sembol boyutları, kullanılabilirlik, okunabilirlik vb.) Var mıdır?std :: true_type ile statik constexpr const arasında geçiş yapma bool üyesi

template < typename T > 
struct IsSharedPtr : std::false_type 
{ 
}; 

vs

template < typename T > 
struct IsSharedPtr 
{ 
    static constexpr bool value = false; 
}; 

İlgili bir soru ...

template < typename T, typename Enabler > 
struct S; 

template < typename T > 
struct S < T, std::true_type >{}; 

template < typename T > 
struct S < T, std::false_type >{}; 

Miras

template < typename T, bool enabler > 
struct S; 

template < typename T > 
struct S < T, true >{}; 

template < typename T > 
struct S < T, false >{}; 

cevap

6

vs true_type/false_type zaten işbirliği sağlayacaktır karşılık gelen value üyesi, işlev çağrısı işleci ve bool'a örtük dönüştürme. Eğer miras kullanacağı ek olarak, senin tipin SFINAE genellikle daha net ve kolay etiket sevk için uygun olacaktır çünkü: biraz daha katı olabilir ayrıca ikinci bir şablon argüman üzerinde gönderebilir

namespace detail 
{ 
template <typename T> 
void do_work(T& foo, std::true_type); 

template <typename T> 
void do_work(T& foo, std::false_type); 
} 

template <typename T> 
void do_something(T& foo) 
{ 
    //Selects overload depending on type of IsSharedPtr<T> 
    detail::do_work(foo, IsSharedPtr<T>{}) 
} 
+0

Not tip (özellik) dönüşümler, işlevin seçiminde yer almaz. – rubenvb

İlgili konular