2016-03-20 25 views
0

Ben sınıflara vardır:Farklı türde argümanlar alan bir işlev nasıl yazılır?

template <class T> 
class shared_vector 
{ 
    T data; 
} 

template <class T> 
class device_vector 
{ 
    T data; 
} 

Ben, herhangi bir nesne accects bir f fonksiyonu yazma tip shared_vector veya device_vector ait olsun istiyorum ve buna göre bazı bayrak ayarlar.

Artık bariz çözüm, aşırı yükleme işlevine gitmektir. Ancak, f fonksiyonunun shared_vector veya device_vector, olabilen 10 argümanı aldığını varsayalım, 1024 aşırı yüklenmiş fonksiyon yazmam gerekecek.

Başka bir çözümhybrid_vector olan device_vector ve shared_vector miras hem bir ana sınıfı kullanmaktır.

Ancak maalesef, device_vector kodu benim denetimimde değil.

Bu sorunu nasıl çözmeliyim?

Not: Tipik (değişken) .name() türünü anlatabildiğimi biliyorum, ancak işlev bildirimi ne olacak ve bundan nasıl bir sonuç çıkarabilirim?

+1

Bu birleştirici patlamayı çözmek için oluşturucu desenini isteyebilirsiniz gibi geliyor. –

+1

Bu çeşitli türler ortak olan nedir? –

+0

Veya aslında, süper tip işaretçilerden oluşan bir dizi. Söz konusu türleri kontrol etmediğiniz için kendi sarmalayıcı türlerinizi oluşturabilirsiniz. –

cevap

2

boost::variant<shared_vector<T>, device_vector<T>> kabul etmek için bir seçenek olabilir.

template<typename V> 
std:enable_if< 
    std::same_type<V, shared_vector<decltype(V::data)>::value | 
    std::same_type<V, device_vector<decltype(V::data)>::value , 
    void>::type 
foo(V const& vector); 

Hala V1..V10 varsa ayrıntılı olacak ama öyle değil, 1024. sadece 2 * 10 denetler var Ve tabii o 2 testleri tamamlamayı kendi is_device_or_shared<Vector>::value yazabilirsiniz:

Diğer bir seçenek std::enable_if olduğunu biraz daha okunabilir bir şey.

İlgili konular