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?
Dlaczego to musi być metoda łańcuchowa? Jeśli masz na celu (potencjalnie zagnieżdżone) wywołania funkcji, byłoby to banalne. – delnan
@delnan Czy możesz podać przykład tego, co masz na myśli? – Phorce
'toBool (toArray (wave.getWaveData()))' zamiast 'wave.getWaveData(). ToArray(). ToBool()'. – delnan