#include <iostream>
#include <array>
#include <vector>

using namespace std;

template<typename TContainer>
class GYoba final {
public:
	GYoba();
	
	int rows() const { return mRows; }
	int cols() const { return mCols; }

private:
	int mRows;
	int mCols;
	TContainer mData;
};

template<typename TValue, int rows, int cols>
using StaticYoba = GYoba<std::array<TValue, rows * cols>>;

template<typename TValue>
using DynamicYoba = GYoba<std::vector<TValue>>;

template<typename TContainer>
GYoba<TContainer>::GYoba() : mRows(0), mCols(0)
{
}

template<typename TValue, int rows, int cols>
template<> StaticYoba<TValue, rows, cols>::GYoba() : mRows(rows), mCols(cols)
{
}

int main() {
	StaticYoba<double, 3, 3> sYoba;
	std::cout << sYoba.rows() << " " << sYoba.cols() << std::endl;
	return 0;
}