#include <iostream>
using namespace std;
struct Z { };
template<class> struct Y { };
template<template <class> class... T>
struct X
{
#if defined(__clang__)
static const constexpr size_t count = sizeof...(T); // Clang
#elif defined(_MSC_VER)
static const size_t count = sizeof...(T); // MSVC 2013 - same as Clang
#elif defined(__GNUC__)
static const constexpr size_t count = sizeof...(T<Z>); // GCC (can be any valid template argument)
#endif
};
int main()
{
// should output 0 and 2
cout << X<>::count << endl;
cout << X<Y,Y>::count << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFogeyB9Owp0ZW1wbGF0ZTxjbGFzcz4gc3RydWN0IFkgeyB9OwoKdGVtcGxhdGU8dGVtcGxhdGUgPGNsYXNzPiBjbGFzcy4uLiBUPgpzdHJ1Y3QgWAp7CiNpZiBkZWZpbmVkKF9fY2xhbmdfXykKCXN0YXRpYyBjb25zdCBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mLi4uKFQpOyAvLyBDbGFuZwojZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQoJc3RhdGljIGNvbnN0ICAgICAgICAgICBzaXplX3QgY291bnQgPSBzaXplb2YuLi4oVCk7IC8vIE1TVkMgMjAxMyAtIHNhbWUgYXMgQ2xhbmcKI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKCXN0YXRpYyBjb25zdCBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mLi4uKFQ8Wj4pOyAvLyBHQ0MgKGNhbiBiZSBhbnkgdmFsaWQgdGVtcGxhdGUgYXJndW1lbnQpCiNlbmRpZgp9OwoKaW50IG1haW4oKQp7CgkvLyBzaG91bGQgb3V0cHV0IDAgYW5kIDIKCWNvdXQgPDwgWDw+Ojpjb3VudCA8PCBlbmRsOwogICAgY291dCA8PCBYPFksWT46OmNvdW50IDw8IGVuZGw7CglyZXR1cm4gMDsKfQo=