#include <cstddef>
template <typename T, unsigned int index, T In, T... args>
struct GetArg
{
static const T value = GetArg<T, index-1, args...>::value;
};
template <typename T, T In, T... args>
struct GetArg<T, 0, In, args...>
{
static const T value = In;
};
template <typename T, T In>
struct GetArg<T, 1, In>
{
static const T value = -1;
};
template <typename T, std::size_t Size>
struct CVector
{
};
template <typename T, std::size_t Height, std::size_t Width>
struct CMatrix
{
};
template <typename T, std::size_t... Sizes>
struct CTensor
{
template <std::size_t SZ = sizeof...(Sizes)>
operator CVector<T, GetArg<std::size_t, 0, Sizes...>::value>() const
{
static_assert(SZ == 1, "You can only convert a rank 1 tensor to a vector");
CVector<T, Sizes...> vecResult;
return vecResult;
}
template <std::size_t SZ = sizeof...(Sizes)>
operator CMatrix<T, GetArg<std::size_t, 0, Sizes...>::value, GetArg<std::size_t, 1, Sizes...>::value>() const
{
static_assert(SZ == 2, "You can only convert a rank 2 tensor to a matrix");
CMatrix<T, Sizes...> matResult;
return matResult;
}
};
int main()
{
CTensor<float, 3> tensor3;
CTensor<float, 3, 3> tensor3_3;
CTensor<float, 3, 3, 3> tensor3_3_3;
CVector<float, 3> vec(tensor3);
//CVector<float, 3> vec2(tensor3_3);
CMatrix<float, 3, 3> mat(tensor3_3);
//CMatrix<float, 3, 3> mat2(tensor3_3_3);
}
I2luY2x1ZGUgPGNzdGRkZWY+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgaW50IGluZGV4LCBUIEluLCBULi4uIGFyZ3M+CnN0cnVjdCBHZXRBcmcKewogICAgc3RhdGljIGNvbnN0IFQgdmFsdWUgPSBHZXRBcmc8VCwgaW5kZXgtMSwgYXJncy4uLj46OnZhbHVlOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFQgSW4sIFQuLi4gYXJncz4Kc3RydWN0IEdldEFyZzxULCAwLCBJbiwgYXJncy4uLj4KewogICAgc3RhdGljIGNvbnN0IFQgdmFsdWUgPSBJbjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBUIEluPgpzdHJ1Y3QgR2V0QXJnPFQsIDEsIEluPgp7CiAgICBzdGF0aWMgY29uc3QgVCB2YWx1ZSA9IC0xOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IFNpemU+CnN0cnVjdCBDVmVjdG9yCnsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBIZWlnaHQsIHN0ZDo6c2l6ZV90IFdpZHRoPgpzdHJ1Y3QgQ01hdHJpeAp7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QuLi4gU2l6ZXM+CnN0cnVjdCBDVGVuc29yIAp7Cgl0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgU1ogPSBzaXplb2YuLi4oU2l6ZXMpPgoJb3BlcmF0b3IgQ1ZlY3RvcjxULCBHZXRBcmc8c3RkOjpzaXplX3QsIDAsIFNpemVzLi4uPjo6dmFsdWU+KCkgY29uc3QKCXsKCSAgICBzdGF0aWNfYXNzZXJ0KFNaID09IDEsICJZb3UgY2FuIG9ubHkgY29udmVydCBhIHJhbmsgMSB0ZW5zb3IgdG8gYSB2ZWN0b3IiKTsKCSAgICBDVmVjdG9yPFQsIFNpemVzLi4uPiB2ZWNSZXN1bHQ7CgkgICAgcmV0dXJuIHZlY1Jlc3VsdDsKCX0KCQoJdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IFNaID0gc2l6ZW9mLi4uKFNpemVzKT4KCW9wZXJhdG9yIENNYXRyaXg8VCwgR2V0QXJnPHN0ZDo6c2l6ZV90LCAwLCBTaXplcy4uLj46OnZhbHVlLCBHZXRBcmc8c3RkOjpzaXplX3QsIDEsIFNpemVzLi4uPjo6dmFsdWU+KCkgY29uc3QKCXsKCSAgICBzdGF0aWNfYXNzZXJ0KFNaID09IDIsICJZb3UgY2FuIG9ubHkgY29udmVydCBhIHJhbmsgMiB0ZW5zb3IgdG8gYSBtYXRyaXgiKTsKCSAgICBDTWF0cml4PFQsIFNpemVzLi4uPiBtYXRSZXN1bHQ7CgkgICAgcmV0dXJuIG1hdFJlc3VsdDsKCX0KfTsKCmludCBtYWluKCkKewoJQ1RlbnNvcjxmbG9hdCwgMz4gdGVuc29yMzsKCUNUZW5zb3I8ZmxvYXQsIDMsIDM+IHRlbnNvcjNfMzsKCUNUZW5zb3I8ZmxvYXQsIDMsIDMsIDM+IHRlbnNvcjNfM18zOwoJQ1ZlY3RvcjxmbG9hdCwgMz4gdmVjKHRlbnNvcjMpOwoJLy9DVmVjdG9yPGZsb2F0LCAzPiB2ZWMyKHRlbnNvcjNfMyk7CglDTWF0cml4PGZsb2F0LCAzLCAzPiBtYXQodGVuc29yM18zKTsKCS8vQ01hdHJpeDxmbG9hdCwgMywgMz4gbWF0Mih0ZW5zb3IzXzNfMyk7Cn0K