2011-03-20 24 views
7

sağlayan belirli şartlarda bir sınıfın bir yapıcısı etkinleştirebilirsiniz nasıl. Sadece yazamaz Neden:şartlı Burada yapıcı

başka işlevi ancak yapıcı
struct Foo 
{ 
    template<class T> 
    Foo(boost::enable_if<is_arithmetic<T>, T>::type* = NULL) 
    {} 
}; 

cevap

8

Yapabilirsin, o zaman şablon argümanları içeren fonksiyon adı değiştirebilirsiniz çünkü. Bir yapıcı ile

Foo foo; 
foo.Method<T>(); 

olsa da, yapıcı adı asla ifade olarak görünür, açıkça şablon parametresini koymayı yer yok. Bir argümandan çıkarmanız gerekiyor.

Foo<T> foo; // no good, assumes the type Foo is a template, not its constructor 
Foo* pfoo = new Foo<T>(); // same problem 

Foo foo((T*)0); // ok, deduced 
Foo* pfoo = new Foo((T*)0); // same 
+0

Doğru anladıysam sorun, şablon argüman kesintisinin başarılı olduğundan emin olmaktır. Bu ister açık bir şekilde türüyle örneklenimin yapılır - foo.Method veya Yöntem indirimi sağlayan bir argüman olması için - şablon geçersiz Yöntemi (U * ptr, artırmak :: enable_if > :: türü * = NULL) {} –

+0

@MK: Evet, çoğu üye işleviyle seçeneğiniz vardır. Yapıcılarla, şablon argümanlarını açıkça belirtmenin bir yolu yoktur. –

+0

@MK: Diğer işlevlerde 'enable_if', şablon argümanı kesintisini bozmamak için dönüş değerine iyi gider. Ne yazık ki, müteahhitlerin bir dönüş türü yok. OTOH, kimse yapıcı işlevinin adresini alamaz ve bu nedenle hiç kimse bu "gizli" ek argümandan rahatsız olmaz. – UncleBens