2013-08-08 25 views
5

Przepraszam, jeśli to pytanie powoduje jakiekolwiek zamieszanie, staram się to wdrożyć i nie znam właściwego sposobu podejścia do takich rzeczy.Metoda łańcuchowa z przestrzeni nazw

Dla jednego z moich projektów chcę zastosować metodę łańcuchową. Chcę włączyć następujące funkcje:

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

Myślałem o umieszczenie ich wewnątrz przestrzeni nazw, np:

namespace Misc { 
    template<typename T, typename Inverse> 

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

    // ... 
    // ... 
} 

To dlatego, że może być wiele klas, klasy te mogą być w stanie wykorzystać te funkcje, dlatego musi być OO, a nie realizować każdą funkcję wielokrotnie w różnych klasach.

Powiedzmy mam następujące klasy Wav, który brzmi w danych zawartych w pliku wav:

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

data jest wyraźnie zapisany jako wektor wewnątrz klasy.

w moim głównym Chcę być w stanie wykonać następujące czynności:

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

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

Nie wiem, czy nie byłoby to możliwe, a jeśli tak, to w jaki sposób podchodzę do tego bez realizacji wszystkich funkcji Misc w kółko w każdej z klas. Czy istnieje sposób komunikacji między przestrzenią nazw a klasą bez konieczności wielokrotnego włączania wszystkich funkcji?

Mam nadzieję, że ktoś ma sugestię i jakiekolwiek pytania, na które spróbuję odpowiedzieć.

EDIT:

mam napisane następujących funkcji:

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; 
} 

A jeśli mam inną funkcję:

void process() 
{ 

} 

Co bym zatem potrzeba, aby umieścić wewnątrz params z process, aby zaakceptować następujące elementy:

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

To jest to, co wprowadza mnie w błąd?

+2

Dlaczego to musi być metoda łańcuchowa? Jeśli masz na celu (potencjalnie zagnieżdżone) wywołania funkcji, byłoby to banalne. – delnan

+0

@delnan Czy możesz podać przykład tego, co masz na myśli? – Phorce

+2

'toBool (toArray (wave.getWaveData()))' zamiast 'wave.getWaveData(). ToArray(). ToBool()'. – delnan

Odpowiedz

2

Odnośnie swojej nowej funkcji:

Aby móc wywołać metodę procesową poniżej

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

parametr dla metody proces powinien być zgodny z typem powrotu metody ToArray. Być może możesz również wprowadzić szablon metody procesu, jak poniżej.

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

Po dodaniu metody procesu jak powyżej, zadzwoń do procesu zostanie skompilowany, ale trzeba będzie dokonać wdrożenia metody procesu wystarczająco rodzajowego do czynienia z różnymi rodzajami zwrotnych z innych metod, takich jak ToArray.