#include <iostream>
#include <algorithm>
#include <functional>
#include <random>
#include <iterator>
#include <type_traits>
template <typename T>
void f()
{
if(!std::is_same<int, T>::value && !std::is_same<double, T>::value)
{
std::cerr << "Wrong template type" << std::endl;
return ;
}
const std::size_t N = 2;
const std::size_t M = 4;
const std::size_t LEN = M * N;
T arr[M][N];
std::mt19937 gen { std::random_device()() };
std::uniform_real_distribution<> dist(static_cast<T>(1),static_cast<T>(9));
//or if(std::is_same<int, T>::value) int_distribution else real_distribution
std::generate(&arr[0][0], &arr[0][0] + LEN, [&]{ return dist(gen); });
for(std::size_t i = 0; i < M; ++i)
{
for(std::size_t j = 0; j < N; ++j)
std::cout << arr[i][j] << ' ';
std::cout << std::endl;
}
std::cout << "Mul: "
<< std::accumulate(&arr[0][0],&arr[0][0] + LEN,static_cast<T>(1),std::multiplies<T>())
<< std::endl;
}
int main(int argc, char *argv[])
{
f<int>(); //or f<double>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBmKCkKewogICAgaWYoIXN0ZDo6aXNfc2FtZTxpbnQsIFQ+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPGRvdWJsZSwgVD46OnZhbHVlKQogICAgewogICAgICAgIHN0ZDo6Y2VyciA8PCAiV3JvbmcgdGVtcGxhdGUgdHlwZSIgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiA7CiAgICB9CiAgICBjb25zdCBzdGQ6OnNpemVfdCBOID0gMjsKICAgIGNvbnN0IHN0ZDo6c2l6ZV90IE0gPSA0OwogICAgY29uc3Qgc3RkOjpzaXplX3QgTEVOID0gTSAqIE47CiAgICBUIGFycltNXVtOXTsKICAgIAogICAgc3RkOjptdDE5OTM3IGdlbiB7IHN0ZDo6cmFuZG9tX2RldmljZSgpKCkgfTsKICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpc3Qoc3RhdGljX2Nhc3Q8VD4oMSksc3RhdGljX2Nhc3Q8VD4oOSkpOwogICAgLy9vciBpZihzdGQ6OmlzX3NhbWU8aW50LCBUPjo6dmFsdWUpIGludF9kaXN0cmlidXRpb24gZWxzZSByZWFsX2Rpc3RyaWJ1dGlvbgogICAKICAgIHN0ZDo6Z2VuZXJhdGUoJmFyclswXVswXSwgJmFyclswXVswXSArIExFTiwgWyZdeyByZXR1cm4gZGlzdChnZW4pOyB9KTsKICAgIAogICAgZm9yKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgTTsgKytpKQogICAgewogICAgICAgIGZvcihzdGQ6OnNpemVfdCBqID0gMDsgaiA8IE47ICsraikKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGFycltpXVtqXSA8PCAnICc7CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIAogICAgc3RkOjpjb3V0IDw8ICJNdWw6ICIKICAgICAgICAgICAgICA8PCBzdGQ6OmFjY3VtdWxhdGUoJmFyclswXVswXSwmYXJyWzBdWzBdICsgTEVOLHN0YXRpY19jYXN0PFQ+KDEpLHN0ZDo6bXVsdGlwbGllczxUPigpKQogICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgZjxpbnQ+KCk7IC8vb3IgZjxkb3VibGU+KCk7Cn0=