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