#include <iostream>
template<typename T, size_t columns>
class TransMatrix {
using Matrix = T(*)[columns];
class Column {
public:
const T& operator[](const size_t column_index) const {
return m_[column_index][line_index_];
}
private:
friend class TransMatrix;
Column(const Matrix P, size_t lines) : m_(P), lines_(lines) { }
const Matrix m_;
const size_t lines_;
size_t line_index_;
};
public:
TransMatrix(Matrix m, size_t lines) : column_(Column(m, lines)) { }
Column& operator[](const size_t line_index) {
column_.line_index_ = line_index;
return column_;
}
private:
Column column_;
};
int main(int argc, char* argv[]) {
constexpr int kColumns = 4;
int a[3][kColumns] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
TransMatrix<int, kColumns> trans(a, 3);
for (int i = 0; i < 4; i++) {
for(int j = 0; j < 3; j++) {
std::cout << trans[i][j] << ", ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IGNvbHVtbnM+CmNsYXNzIFRyYW5zTWF0cml4IHsKICB1c2luZyBNYXRyaXggPSBUKCopW2NvbHVtbnNdOwogIGNsYXNzIENvbHVtbiB7CiAgIHB1YmxpYzoKICAgIGNvbnN0IFQmIG9wZXJhdG9yW10oY29uc3Qgc2l6ZV90IGNvbHVtbl9pbmRleCkgY29uc3QgewogICAgICByZXR1cm4gbV9bY29sdW1uX2luZGV4XVtsaW5lX2luZGV4X107CiAgICB9ICAgCgogICBwcml2YXRlOgogICAgZnJpZW5kIGNsYXNzIFRyYW5zTWF0cml4OwogICAgQ29sdW1uKGNvbnN0IE1hdHJpeCBQLCBzaXplX3QgbGluZXMpIDogbV8oUCksIGxpbmVzXyhsaW5lcykgeyB9IAogICAgY29uc3QgTWF0cml4IG1fOyAKICAgIGNvbnN0IHNpemVfdCBsaW5lc187CiAgICBzaXplX3QgbGluZV9pbmRleF87CiAgfTsgIAoKIHB1YmxpYzoKICBUcmFuc01hdHJpeChNYXRyaXggbSwgc2l6ZV90IGxpbmVzKSA6IGNvbHVtbl8oQ29sdW1uKG0sIGxpbmVzKSkgeyB9IAoKICBDb2x1bW4mIG9wZXJhdG9yW10oY29uc3Qgc2l6ZV90IGxpbmVfaW5kZXgpIHsKICAgIGNvbHVtbl8ubGluZV9pbmRleF8gPSBsaW5lX2luZGV4OwogICAgcmV0dXJuIGNvbHVtbl87CiAgfQoKIHByaXZhdGU6CiAgQ29sdW1uIGNvbHVtbl87Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgY29uc3RleHByIGludCBrQ29sdW1ucyA9IDQ7CgogIGludCBhWzNdW2tDb2x1bW5zXSA9IHsgCiAgICB7IDEsIDIsIDMsIDQgfSwKICAgIHsgNSwgNiwgNywgOCB9LAogICAgeyA5LCAxMCwgMTEsIDEyIH0KICB9OyAgCgogIFRyYW5zTWF0cml4PGludCwga0NvbHVtbnM+IHRyYW5zKGEsIDMpOyAKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgIGZvcihpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKICAgICAgc3RkOjpjb3V0IDw8IHRyYW5zW2ldW2pdIDw8ICIsICI7CiAgICB9ICAgCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogIH0KCiAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQ==
1, 5, 9,
2, 6, 10,
3, 7, 11,
4, 8, 12,