#include <iostream>
template < unsigned N > constexpr
unsigned countarg( const char( &s )[N], unsigned i = 0, unsigned c = 0 )
{
return
s[i] == '\0'
? i == 0
? 0
: c + 1
: s[i] == ','
? countarg( s, i + 1, c + 1 )
: countarg( s, i + 1, c );
}
constexpr
unsigned countarg()
{
return 0;
}
#define ARGC( ... ) countarg( #__VA_ARGS__ )
int main()
{
std::cout
<< ARGC() << std::endl
<< ARGC( 1 ) << std::endl
<< ARGC( one, two ) << std::endl
<< ARGC( "abc", 123, XYZ ) << std::endl
<< ARGC( unknown = 0, red = 1, green = 2, blue = 4 ) << std::endl
<< ARGC( "1", "2", "3", "4", "5" ) << std::endl
<< "Wrong (comma must be escaped): " << ARGC( "This is a comma: ," ) << std::endl
<< "Fine: " << ARGC( "This is a comma: \x2c" );
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIAogICAgdGVtcGxhdGUgPCB1bnNpZ25lZCBOID4gY29uc3RleHByCiAgICB1bnNpZ25lZCBjb3VudGFyZyggY29uc3QgY2hhciggJnMgKVtOXSwgdW5zaWduZWQgaSA9IDAsIHVuc2lnbmVkIGMgPSAwICkKICAgIHsKICAgICAgcmV0dXJuCiAgICAgICAgc1tpXSA9PSAnXDAnCiAgICAgICAgPyBpID09IDAKICAgICAgICA/IDAKICAgICAgICA6IGMgKyAxCiAgICAgICAgOiBzW2ldID09ICcsJwogICAgICAgID8gY291bnRhcmcoIHMsIGkgKyAxLCBjICsgMSApCiAgICAgICAgOiBjb3VudGFyZyggcywgaSArIDEsIGMgKTsKICAgIH0KICAgIAogICAgY29uc3RleHByCiAgICB1bnNpZ25lZCBjb3VudGFyZygpCiAgICB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgCiAgICAjZGVmaW5lIEFSR0MoIC4uLiApIGNvdW50YXJnKCAjX19WQV9BUkdTX18gKQogICAgCgogICAgaW50IG1haW4oKQogICAgewoJICBzdGQ6OmNvdXQKCSAgICA8PCBBUkdDKCkgPDwgc3RkOjplbmRsCgkgICAgPDwgQVJHQyggMSApIDw8IHN0ZDo6ZW5kbAoJICAgIDw8IEFSR0MoIG9uZSwgdHdvICkgPDwgc3RkOjplbmRsCgkgICAgPDwgQVJHQyggImFiYyIsIDEyMywgWFlaICkgPDwgc3RkOjplbmRsCgkgICAgPDwgQVJHQyggdW5rbm93biA9IDAsIHJlZCA9IDEsIGdyZWVuID0gMiwgYmx1ZSA9IDQgKSA8PCBzdGQ6OmVuZGwKCSAgICA8PCBBUkdDKCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiApIDw8IHN0ZDo6ZW5kbAoJICAgIDw8ICJXcm9uZyAoY29tbWEgbXVzdCBiZSBlc2NhcGVkKTogIiA8PCBBUkdDKCAiVGhpcyBpcyBhIGNvbW1hOiAsIiApIDw8IHN0ZDo6ZW5kbAoJICAgIDw8ICJGaW5lOiAiIDw8IEFSR0MoICJUaGlzIGlzIGEgY29tbWE6IFx4MmMiICk7CgkgICAgCiAgICAgIHJldHVybiAwOwogICAgfQ==