2011-05-13 36 views
11

Bir şablon sınıfından türetilmiş olup olmadığını nasıl belirleyebilirim? Özellikle, bir şablon parametresinin bir temel sınıf olarak std::basic_ostream olup olmadığını belirlemem gerekir. Normalde std::is_base_of, iş için bir araçtır. Ancak, std::is_base_of yalnızca sınıf şablonları değil, tam türler için çalışır.Bir şablon sınıfından tür türetilir nasıl belirlenir?

Bunun gibi bir şey arıyorum.

template< typename T > 
bool is_based_in_basic_ostream(T&& t) 
{ 
    if(std::is_base_of< std::basic_ostream< /*anything*/>, T >::value) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Bunun mümkün olabileceğine eminim.

+1

Sadece içeri atmak istediğinizde, if/else dalının tamamını if ifadesinde koşulu döndüren tek bir 'return' satırı ile değiştirebilirsiniz! – AshleysBrain

+0

, "T türünde bir" tipi değil mi? Kodunuzda ne/* bir şey */'olarak belirtin? – iammilind

+0

Benim durumumda, orada sadece integral karakter tiplerini görmeyi beklerdim. Ben/* bir şey */'tam bir tür olmadıkça basic_ostream'in başlatılamayacağını düşünüyorum. –

cevap

12

Kısa ve özlü bir yoldan haberdar değilim. Ancak yine de aşırı yüklenmeyi kötüye kullanabilirsiniz: http://www.microsoft.com/turkiye/default.aspx?answerid= (Sadece kısıtlı kullanımı yüzden, bu test de girdi akışları için olumlu olacak) yerine

std::is_base_of<std::ios_base, T> 
+1

“std :: ios_base” ifadesinin kontrol edilmesiyle ilgili problem, giriş akışlarının da algılanması ve OP'nin istediği anlamların ihlal edilmesidir. – ildjarn

+0

@ildjarn Katılıyorum. Sanırım daha açık olmalıydım. Bunu açıkça söylediğin için teşekkürler. Sabit :) –

5

Boost is_instance_of gibi bir şey olabilir eşit derecede iyi sizin için işe yarayabilir ki, ios_base den türetme algılayabilir unutmayın ne sonra mı? Eğer üretecek akım GCC (4.6.0) ile, variadic şablonlara bu genişletmek çalışırsanız, maalesef

#include <iostream> 
#include <type_traits> 

template <template <typename> class F> 
struct conversion_tester 
{ 
     template <typename T> 
     conversion_tester (const F<T> &); 
}; 

template <class From, template <typename> class To> 
struct is_instance_of 
{ 
     static const bool value = std::is_convertible<From,conversion_tester<To>>::value; 
}; 

template <typename T> 
struct foo {}; 

template <typename T> 
struct bar {}; 

int main() 
{ 
     std::cout << is_instance_of<foo<int>,foo>::value << '\n'; // This will print '1'. 
     std::cout << is_instance_of<bar<int>,foo>::value << '\n'; // This will print '0'. 
} 

: Burada

http://www.boost.org/doc/libs/1_46_1/boost/lambda/detail/is_instance_of.hpp

1-argüman şablonları için kısa versiyonu bir hata mesajı. This SO answer, bunun şu anda bir GCC sorunu olduğunu ve varadik şablon sürümünün standarda göre çalışması gerektiğini ima eder.

İlgili konular