Здравствуйте, sci_reseacher, Вы писали:
_>наверное лучший вариант переделать базовый класс
_>
_>struct B {
_> virtual vector<float> getX() = 0 ;
_>};
_>struct C: public B {
_> float *X;
_> int size;
_> virtual vector<float> getX(){
_> vector<float> tmp(X,X+size);
_> return tmp;
_> }
_>};
_>struct D: public B {
_> vector<float> X;
_> virtual vector<float> getX(){
_> return X;
_> }
_>};
_>
_>и использовать так
_>_>const vector<float> & w = d.getX(); // только вот здесь нет ли лишней копии вектора?
_>
тут возможны альтернативы.
нужно оценить, насколько негативно в плане производительности, будет возврат вектора по значению. сколько там элементов ? как часто зовется ?
попробую набросать другие варианты:
1)
struct B {
virtual void getX(vector<float>& result) = 0; <-- при таком подходе можно выиграть на аллокациях, если входной вектор имеет нужный capacity
};
2) оторвать указатель и размер от хранилища, которое владеет памятью
struct B {
virtual float* getXBegin() = 0;
virtual size_t getXSize() = 0;
};
3) можно объединить размер и указатель
struct B {
virtual pair<float*, size_t> getX() = 0;
};
4) либо сделать\заюзать аналог array_view/string_view/string_ref/ link:
http://stackoverflow.com/questions/34832090/whats-the-difference-between-span-and-array-view-in-the-gsl-library
5) либо прокинуть функтор для итерации по контейнеру (поэлементно, либо некими группами\страницами)
struct B {
virtual void processX(std::function<float> f) = 0; //<-- f will be invoked for each "float" value
};
успехов