#include <iostream>
#include <array>
// related: https://stackoverflow.com/questions/17388317/c11-implicit-conversion-from-initialization-list-to-array-parameter
template<int V>
struct Cls {int val(){return V;} };
template <int V>
auto make(std::array<const size_t, V> shape) -> Cls<V>{
return Cls<V>();
}
// unfortunately, this doesn't work either:
// template <int V>
// constexpr size_t arr_len(std::array<const size_t, V>){return V;}
// template <int V>
// auto make(std::array<const size_t, V> shape) -> Cls<arr_len(shape)>{
// return Cls<arr_len(shape)>();
// }
int main(int argc, char const *argv[])
{
// I would like to write the following and the compiler should figure out V=2
// auto t0 = make({2, 3}); // doesn't work
// auto t0 = make(2, 3); // would be also ok
auto t1 = make<2>({2, 3}); // does work but need the information twice
std::cout << t1.val() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CgovLyByZWxhdGVkOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNzM4ODMxNy9jMTEtaW1wbGljaXQtY29udmVyc2lvbi1mcm9tLWluaXRpYWxpemF0aW9uLWxpc3QtdG8tYXJyYXktcGFyYW1ldGVyCgp0ZW1wbGF0ZTxpbnQgVj4Kc3RydWN0IENscyB7aW50IHZhbCgpe3JldHVybiBWO30gfTsKCgoKdGVtcGxhdGUgPGludCBWPgphdXRvIG1ha2Uoc3RkOjphcnJheTxjb25zdCBzaXplX3QsIFY+IHNoYXBlKSAtPiBDbHM8Vj57CiAgcmV0dXJuIENsczxWPigpOwp9CgovLyB1bmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXNuJ3Qgd29yayBlaXRoZXI6Ci8vIHRlbXBsYXRlIDxpbnQgVj4KLy8gY29uc3RleHByIHNpemVfdCBhcnJfbGVuKHN0ZDo6YXJyYXk8Y29uc3Qgc2l6ZV90LCBWPil7cmV0dXJuIFY7fQovLyB0ZW1wbGF0ZSA8aW50IFY+Ci8vIGF1dG8gbWFrZShzdGQ6OmFycmF5PGNvbnN0IHNpemVfdCwgVj4gc2hhcGUpIC0+IENsczxhcnJfbGVuKHNoYXBlKT57Ci8vICAgcmV0dXJuIENsczxhcnJfbGVuKHNoYXBlKT4oKTsKLy8gfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pCnsKICAvLyBJIHdvdWxkIGxpa2UgdG8gd3JpdGUgdGhlIGZvbGxvd2luZyBhbmQgdGhlIGNvbXBpbGVyIHNob3VsZCBmaWd1cmUgb3V0IFY9MgogIC8vIGF1dG8gdDAgPSBtYWtlKHsyLCAzfSk7IC8vIGRvZXNuJ3Qgd29yawogIC8vIGF1dG8gdDAgPSBtYWtlKDIsIDMpOyAvLyB3b3VsZCBiZSBhbHNvIG9rCiAgYXV0byB0MSA9IG1ha2U8Mj4oezIsIDN9KTsgLy8gZG9lcyB3b3JrIGJ1dCBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0d2ljZQogIHN0ZDo6Y291dCA8PCB0MS52YWwoKSA8PCBzdGQ6OmVuZGw7CgogIHJldHVybiAwOwp9