Цепочка методов из пространства имен

Извините, если этот вопрос вызывает путаницу, я пытаюсь реализовать это и не знаю, как правильно подойти к такой вещи.

Для одного из моих проектов я хочу реализовать цепочку методов. Я хочу включить следующие функции:

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

Я думал о размещении их внутри пространства имен, например:

namespace Misc {
   template<typename T, typename Inverse>

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

   // ...
   // ...
}

Это связано с тем, что может быть несколько классов, эти классы МОГУТ использовать эти функции, поэтому это должно быть объектно-ориентированным, а не реализовывать каждую функцию снова и снова в разных классах.

Допустим, у меня есть следующий класс Wav, который считывает данные, содержащиеся в wav-файле:

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

data явно хранится как вектор внутри класса.

В моем основном я хочу иметь возможность сделать следующее:

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

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

Я не знаю, возможно ли это, и если да, то как бы я подошел к этому без реализации всех функций Misc снова и снова внутри каждого из классов. Есть ли способ связи между пространством имен и классом без необходимости снова и снова включать все функции?

Я надеюсь, что у кого-то есть предложение и любые вопросы, на которые я постараюсь ответить.

РЕДАКТИРОВАТЬ:

Я написал следующую функцию:

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

И если у меня есть другая функция:

void process()
{

}

Поэтому мне нужно было бы поместить внутрь params из process, чтобы принять следующее:

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

Это то, что меня больше всего смущает?


person Phorce    schedule 08.08.2013    source источник
comment
Почему это должна быть цепочка методов? Если бы вы стремились к (потенциально вложенным) вызовам функций, это было бы тривиально.   -  person    schedule 09.08.2013
comment
@delnan Не могли бы вы привести пример того, что вы имеете в виду?   -  person Phorce    schedule 09.08.2013
comment
toBool(toArray(wave.getWaveData())) вместо wave.getWaveData().toArray().toBool().   -  person    schedule 09.08.2013
comment
Для объединения в цепочку все разные классы должны наследоваться. Я думаю, что лучше этого не делать, потому что, насколько мне известно, это не будет хорошим ОО-дизайном. Это также приведет к зависимостям.   -  person    schedule 09.08.2013
comment
Поскольку фактическая работа каждой функции должна быть разной для каждого класса, я действительно не понимаю, чего вы надеетесь достичь, имея их внешними. Пусть getWaveData и подобные возвращают объект-оболочку, внутри которого определены toArray и т. д. Это было бы довольно легко. Однако вам нужно быть осторожным с масштабом; похоже, что вы получите несколько segfaults / недопустимых чтений памяти, если вы не будете осторожны.   -  person Dave    schedule 09.08.2013
comment
@delnan Спасибо. Я понимаю, что вы имеете в виду, я попытаюсь попробовать без цепочки методов   -  person Phorce    schedule 09.08.2013
comment
@delnan Пожалуйста, не могли бы вы увидеть мою обновленную публикацию и помочь мне понять, где я ошибаюсь в предложенном вами процессе. Если вы поместите это как ответ, я могу принять это. Спасибо :)   -  person Phorce    schedule 09.08.2013
comment
@Phorce Эм, то же самое, что вы бы добавили туда, независимо от того, как генерируется значение аргумента? Это действительно зависит от того, что должен делать process, возможно, вызов toArray<int>(...) неверен. Но если часть toArray<int>(...) определенно верна, все очень просто: toArray возвращает int * (обычно T * для любого типа T, но указанное как int в этом месте вызова), и это возвращаемое значение передается в качестве аргумента в process. У вас есть три предположения, которые должны принять process, чтобы компилятор был доволен типами ;-)   -  person    schedule 09.08.2013


Ответы (1)


Что касается вашей новой функции:

Чтобы иметь возможность вызывать метод процесса ниже

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

параметр для метода процесса должен соответствовать типу возвращаемого значения метода toArray. Возможно, вы также можете создать шаблон метода процесса, как показано ниже.

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

После добавления метода процесса, как указано выше, вызов процесса будет скомпилирован, но вам придется сделать реализацию метода процесса достаточно общей, чтобы иметь дело с различными типами возвращаемых данных из других методов, таких как toArray.

person facthunter    schedule 09.08.2013