#include <iostream>
#include <array>
#include <memory>

std::unique_ptr<float[]> data(new float[40]());

struct LinhaSobre4f
{
    LinhaSobre4f(float * pos_begin, size_t size_):
        pos0(pos_begin),
        size_(size_){}
    std::array<float, 4> & operator[](size_t i)const
    {
        std::array<float,4> * r = 
            reinterpret_cast<std::array<float,4>*> (pos0+(4*i));
        return *r;
    }
    size_t size()const
    {
    	return size_;
    }
private:
    float * pos0;
    size_t size_;
};

int main() {
	LinhaSobre4f l(data.get()+(3*4), 4);
	//assigning from container
    	for(size_t i = 0; i < l.size(); i++)
    		l[i] = { {1.5f, 2.5f, 3.5f, 4.5f} };
	//printing from data itself
    	for(size_t i = 0; i < 10; i++)
    	{
    		std::cout << "f4 " << i << " : " ;
    		for(size_t j = 0; j < 4; j++)
    			std::cout << data[i*4+j] << " ";
    		std::cout << std::endl;
    	}
	return 0;
}