2013-08-08 13 views
5

Eğer bu soru herhangi bir karışıklığa neden oluyorsa özür dilerim, bunu uygulamaya çalışıyorum ve böyle bir şeye yaklaşmanın doğru yolunu bilmiyorum.İsim uzayından zincirleme

Projelerimden birinde yöntem zincirleme uygulamak istiyorum. Ben aşağıdaki işlevleri dahil etmek istiyorum:

.toVector() 
.toArray() 
.toBool() 
... 

Ben bir isim alanı içinde bu yerleştirerek düşündüm mesela:

namespace Misc { 
    template<typename T, typename Inverse> 

    vector<T> toVector(Inverse begin, Inverser end) { 
     // ... 
     // .. 
    } 

    // ... 
    // ... 
} 

Bu çoklu sınıfları olabilir, çünkü bu sınıflar kullanabilecektir OLABİLİR olduğunu Bu nedenle, bu işlevler, her bir işlevi farklı sınıflarda tekrar tekrar uygulamak yerine, OO olmalıdır.

class Wav { 
    public: 
    Wav(); 
    Wav(string theFileName); 
    void getWaveData(); 
    protected: 
    vector<double> data; 
}; 

data açıkça sınıfın içinde bir vektörü olarak depolanır:

ı bir wav dosyasında bulunan verileri okur aşağıdaki sınıf Wav var diyelim.

int main() 
{ 
    Wav wave("file.wav"); 

    int* data = wave.getWaveData().toArray(); // Method chaining to store as an array 
} 

bu mümkün olacağını olup olmadığını bilmiyorum ve eğer öyleyse ben Misc fonksiyonların hepsi uygulamadan bu yaklaşım nasıl: Benim ana olarak

ben aşağıdakileri yapmak mümkün istiyorum Her bir sınıfın içinde tekrar tekrar. Tüm fonksiyonların tekrar tekrar dahil edilmesine gerek kalmadan isim alanı ile sınıf arasında iletişim kurmanın bir yolu var mı?

Umarım birisinin bir öneri ve cevaplamaya çalışacağım sorular vardır.

DÜZENLEME:

Ben yazılı aşağıdaki fonksiyonu:

void process() 
{ 

} 

Dolayısıyla ben bu params içine koymak gerekir Ne:

template<typename T, typename Inverse> 
T* toArray(Inverse begin, Inverse end) 
{ 
size_t size = distance(begin, end); 
auto pos = 0; 

T* tmp = new T[size]; 

for(auto i = begin; i != end; i++) 
{ 
    tmp[pos] = *i; 
    pos++; 
} 
return tmp; 
} 

Ve başka bir fonksiyon varsa Aşağıdakileri kabul etmek için process:

int* data = process(toArray<int>( std::begin(vals), std::end(vals) );

En çok kafa karıştırıcı olan şey bu mu? Yeni işlevi ile ilgili olarak

+2

Neden yöntem zincirleme olmalı? Eğer (potansiyel olarak iç içe) işlev çağrıları amaçladıysanız, bu önemsiz olacaktır. – delnan

+0

@delnan Lütfen ne demek istediğine bir örnek verebilir misiniz? Wave.getWaveData(). ToArray(). ToBool() 'yerine" – Phorce

+2

"toBool (toArray (wave.getWaveData())). – delnan

cevap

2

:

amacıyla

int* data = process(toArray<int>(vals.begin(), vals.end())); 

altında toArray yöntemin dönüş türü aynı olmalıdır süreç yöntemi için parametre işlem yöntemini çağırmak edebilmek için. Belki de aşağıdaki gibi işlem yöntemini de düzenleyebilirsiniz.

template<typename T> 
T* process(T* t) 
{ 
    //more code here 
    return t; 
} 

yukarıdaki gibi işlem yöntemi ekledikten sonra sürecine çağrı derlemek, ancak ToArray gibi diğer yöntemlerden farklı dönüş türleri ile başa çıkmak için yeterince jenerik süreç yönteminin uygulanmasını yapmak zorunda kalacaktır.