2013-12-10 17 views
7

Bu ilginç iplik bakıyordu: https://stackoverflow.com/a/16596463/2436175şablon şablon parametreleri: Bildirimi daha da küçük yapabilir miyim?

Benim spesifik durum endişeleri OpenCV bir std cv kabı :: Point_ ve cv :: Rect_ kullanarak templated işlevi bildirerek. karşı Ben şablon istiyorum:

  • std kabın tip I cv :: Point_ ve cv tanımını tamamlamak için
  • temel veri tiplerini kullanacaktır :: Rect_

Ben bitti

template <typename T, template <typename, typename> class Container_t> 
    void CreateRects(const Container_t<cv::Point_<T>,std::allocator<cv::Point_<T> > >& points, 
        const T value, 
        Container_t<cv::Rect_<T>,std::allocator<cv::Rect_<T> > >& rects) { 

    } 

bu ince derler:

aşağıdaki bildirge 0
void dummy() { 

const std::vector<cv::Point_<double> > points; 
std::vector<cv::Rect_<double> > rects; 
CreateRects(points,5.0,rects); 

} 

(Ben de, ben de, örneğin kullanabileceği CreateRects<double>(points,5,rects) gördük)

, mesela benim beyanı daha kompakt hale getirmek için herhangi bir şekilde varolduğunu acaba Varsayılan ayırıcının 2 katını belirtmeye gerek kalmadan.

template <typename T, class C1, class C2> 
void CreateRects(const C1& points, 
       const T value, 
       C2& rects) { 

} 

O okumak daha kolay derler ve türleri uyumsuz,, bir derleyici hatası alırsınız: yaklaşık gibi basit kodla neler oluyor

+1

Neden istiyorsun etmek beyanı sıkıştırmak? Performans artışı yoktur ve derleme sırasında birikmiş zaman, StackOverflow'a gönderilerek harcanmıştır. –

+2

@ThomasMatthews İyileştirebiliyor olsaydım, herhangi bir şekilde okunabilirlik olabilir, bu benim kodumla daha sonra uğraşmak zorunda kaldığım zamana (hatta kendime) zaman kazandırabilir. Ama bir noktan var. Bazen sadece sorular soruyorum, çünkü onları ilginç buldum ve derhal kullanışlı değil. – Antonio

cevap

11

Sen işlev şablonuna şablon şablon parametresi Container_t şablon parametreleri için açıklama ekleyebilirsiniz

template 
    < 
     typename T, 
     template <typename...> class Container_t 
    > 
void CreateRects 
    (
     const Container_t<cv::Point_<T>>& points, 
     const T value, 
     Container_t<cv::Rect_<T>>& rects 
    ) 
{ 

} 
+0

İyi şeyler, teşekkürler! Aslına bakarsanız, sorumun cevabının zaten gönderdiğim bağlantıda olduğunu fark ettim, bunu nasıl özlediğimi merak ediyorum! Cevabınız resme variadic şablonlar ekler, bu yüzden sorduğumda sevindim :) – Antonio

+0

@Antonio Şablon arasında küçük bir fark var: > sınıf Container_t> void CreateRects (...); 've' şablon > sınıf Container_t> void CreateRects (...); '. Ama haklısınız, benzer çözüm senin bağlantındaydı. – Constructor

0

.

template 
    < 
     typename T, 
     template 
      < 
       typename U, 
       typename = std::allocator<U> 
      > 
     class Container_t 
    > 
void CreateRects 
    (
     const Container_t<cv::Point_<T> >& points, 
     const T value, 
     Container_t<cv::Rect_<T> >& rects 
    ) 
{ 

} 

Yoksa C++ 11 variadic şablonları kullanabilirsiniz:

+0

2 kapsayıcı 2 farklı nesne türü (Point_ ve Rect_ ) içerir, bunun işe yaradığından emin misiniz? Deneme, oldukça beklenen bir 'şablon argüman kesinti/ikame başarısız' hatası, '' Container_t 'parametresi için çelişkili türler çıkarıldı' (std :: vektör > ve std :: vektör > – Antonio

+0

2 konteyner kullandığınızı farketmedim. Bunu düzelteceğim ... Sabit – egur

+0

Hmmmm ... Bu çalışmayı kabul etmiyorum, ama biraz daha fazla kontrol sahibi olmak istiyorum, örneğin zorlamak istiyorum 2 konteynerin aynı türden olması (her iki vektörün veya her iki listenin) – Antonio

İlgili konular