#include <type_traits>
#include <array>
template < bool ...> struct bools { } ;
template < bool ... bs >
using all_of = :: std :: is_same < bools< true , bs...> , bools< bs..., true >> ;
template < typename ... Ts >
using contains_only_array_of_3_int =
all_of< :: std :: is_same < :: std :: array < int , 3 > , Ts> :: value ...> ;
template < std:: size_t V>
class Test
{
public :
Test( ) { }
template < typename ... TArgs >
Test( TArgs&& ... args )
{
static_assert( sizeof ...( TArgs) == V, "arguments count mismatch" ) ;
static_assert( contains_only_array_of_3_int< :: std :: decay_t < TArgs> ...> :: value ,
"arguments type mismatch" ) ;
}
} ;
int main( )
{
:: std :: array < int , 3 > a{ 1 , 2 , 3 } ;
Test< 1 > t
{
:: std :: array < int , 3 > { 1 , 2 , 3 }
} ;
Test< 2 > t2
{
:: std :: array < int , 3 > { 1 , 2 , 3 }
, :: std :: array < int , 3 > { 4 , 5 , 6 }
} ;
Test< 3 > t3
{
a
, :: std :: array < int , 3 > { 4 , 5 , 6 }
, :: std :: array < int , 3 > { 7 , 8 , 9 }
} ;
Test< 3 > t3_args_count_fail
{
:: std :: array < int , 3 > { 1 , 2 , 3 }
, :: std :: array < int , 3 > { 4 , 5 , 6 }
} ;
Test< 3 > t3_args_tupe_fail
{
:: std :: array < int , 3 > { 1 , 2 , 3 }
, :: std :: array < int , 2 > { 4 , 5 }
, :: std :: array < int , 3 > { 7 , 8 , 9 }
} ;
return ( 0 ) ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8YXJyYXk+Cgp0ZW1wbGF0ZSA8Ym9vbC4uLj4gc3RydWN0IGJvb2xzIHt9OwoKdGVtcGxhdGUgPGJvb2wuLi4gYnM+CnVzaW5nIGFsbF9vZiA9IDo6c3RkOjppc19zYW1lPGJvb2xzPHRydWUsIGJzLi4uPiwgYm9vbHM8YnMuLi4sIHRydWU+PjsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uIFRzPgp1c2luZyBjb250YWluc19vbmx5X2FycmF5X29mXzNfaW50ID0KCWFsbF9vZjw6OnN0ZDo6aXNfc2FtZTw6OnN0ZDo6YXJyYXk8aW50LCAzPiwgVHM+Ojp2YWx1ZS4uLj47Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgVj4KY2xhc3MgVGVzdAp7CnB1YmxpYzoKCVRlc3QoKSB7fQoKCXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUQXJncz4KCVRlc3QoVEFyZ3MmJiAuLi4gYXJncykgCgl7CgkJc3RhdGljX2Fzc2VydChzaXplb2YuLi4oVEFyZ3MpID09IFYsICJhcmd1bWVudHMgY291bnQgbWlzbWF0Y2giKTsKCQlzdGF0aWNfYXNzZXJ0KGNvbnRhaW5zX29ubHlfYXJyYXlfb2ZfM19pbnQ8OjpzdGQ6OmRlY2F5X3Q8VEFyZ3M+Li4uPjo6dmFsdWUsCgkJICAgICAgICAgICAgICAiYXJndW1lbnRzIHR5cGUgbWlzbWF0Y2giKTsKCX0KfTsKCmludCBtYWluKCkKewoJOjpzdGQ6OmFycmF5PGludCwgMz4gYXsgMSwgMiwgMyB9OwoJVGVzdDwxPiB0Cgl7CgkJOjpzdGQ6OmFycmF5PGludCwgMz57IDEsIDIsIDMgfQoJfTsKCVRlc3Q8Mj4gdDIKCXsKCQk6OnN0ZDo6YXJyYXk8aW50LCAzPnsgMSwgMiwgMyB9CgksCTo6c3RkOjphcnJheTxpbnQsIDM+eyA0LCA1LCA2IH0KCX07CglUZXN0PDM+IHQzCgl7CgkJYQoJLAk6OnN0ZDo6YXJyYXk8aW50LCAzPnsgNCwgNSwgNiB9CgksCTo6c3RkOjphcnJheTxpbnQsIDM+eyA3LCA4LCA5IH0KCX07CglUZXN0PDM+IHQzX2FyZ3NfY291bnRfZmFpbAoJewoJCTo6c3RkOjphcnJheTxpbnQsIDM+eyAxLCAyLCAzIH0KCSwJOjpzdGQ6OmFycmF5PGludCwgMz57IDQsIDUsIDYgfQoJfTsKCVRlc3Q8Mz4gdDNfYXJnc190dXBlX2ZhaWwKCXsKCQk6OnN0ZDo6YXJyYXk8aW50LCAzPnsgMSwgMiwgMyB9CgksCTo6c3RkOjphcnJheTxpbnQsIDI+eyA0LCA1IH0KCSwJOjpzdGQ6OmFycmF5PGludCwgMz57IDcsIDgsIDkgfQoJfTsKCXJldHVybigwKTsKfQo=
compilation info
prog.cpp: In instantiation of ‘Test<V>::Test(TArgs&& ...) [with TArgs = {std::array<int, 3ul>, std::array<int, 3ul>}; long unsigned int V = 3ul]’:
prog.cpp:50:2: required from here
prog.cpp:22:3: error: static assertion failed: arguments count mismatch
static_assert(sizeof...(TArgs) == V, "arguments count mismatch");
^~~~~~~~~~~~~
prog.cpp: In instantiation of ‘Test<V>::Test(TArgs&& ...) [with TArgs = {std::array<int, 3ul>, std::array<int, 2ul>, std::array<int, 3ul>}; long unsigned int V = 3ul]’:
prog.cpp:56:2: required from here
prog.cpp:23:3: error: static assertion failed: arguments type mismatch
static_assert(contains_only_array_of_3_int<::std::decay_t<TArgs>...>::value,
^~~~~~~~~~~~~
stdout