#include <iostream>
#include <type_traits>
template <typename... Ts>
struct default_constructible;
template <typename T>
struct default_constructible<T>
{
static constexpr bool value = std::is_default_constructible<T>::value;
};
template <>
struct default_constructible<>
{
static constexpr bool value = true;;
};
template <typename T, typename U, typename... Ts>
struct default_constructible<T, U, Ts...>
{
static constexpr bool value = std::is_default_constructible<T>::value && default_constructible<Ts...>::value;
};
template <typename... Ts>
struct foo
{
static_assert(default_constructible<Ts...>::value, "");
};
class A { A() = delete; };
template class foo<int, bool, int, int, char, bool>;
//template class foo<int, bool, A>;
int main() {}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CnN0cnVjdCBkZWZhdWx0X2NvbnN0cnVjdGlibGU7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGRlZmF1bHRfY29uc3RydWN0aWJsZTxUPgp7CiAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU7Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPD4KewogICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gdHJ1ZTs7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVHM+CnN0cnVjdCBkZWZhdWx0X2NvbnN0cnVjdGlibGU8VCwgVSwgVHMuLi4+CnsKICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSAmJiBkZWZhdWx0X2NvbnN0cnVjdGlibGU8VHMuLi4+Ojp2YWx1ZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4Kc3RydWN0IGZvbwp7CiAgICBzdGF0aWNfYXNzZXJ0KGRlZmF1bHRfY29uc3RydWN0aWJsZTxUcy4uLj46OnZhbHVlLCAiIik7Cn07CgpjbGFzcyBBIHsgQSgpID0gZGVsZXRlOyB9OwoKdGVtcGxhdGUgY2xhc3MgZm9vPGludCwgYm9vbCwgaW50LCBpbnQsIGNoYXIsIGJvb2w+OwovL3RlbXBsYXRlIGNsYXNzIGZvbzxpbnQsIGJvb2wsIEE+OwoKaW50IG1haW4oKSB7fQ==