#include <iostream>
using namespace std;
template<typename T, size_t w = 0, size_t h = 0> struct C
{
void out()
{
static_assert(w > 0 && h > 0, "both w and h are either 0 or > 0");
cout << "instanciated with w = " << w << ", h = " << h << endl;
}
};
template<typename T> struct C<T, 0, 0>
{
void out()
{
cout << "no w/h specified" << endl;
}
};
int main()
{
C<int> cint;
cint.out();
//C<int, 1> cnum; // fires static_assert, as expected
//cnum.out();
C<int, 1, 1> cnum2;
cnum2.out();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IHcgPSAwLCBzaXplX3QgaCA9IDA+IHN0cnVjdCBDCnsKCXZvaWQgb3V0KCkKCXsKCQlzdGF0aWNfYXNzZXJ0KHcgPiAwICYmIGggPiAwLCAiYm90aCB3IGFuZCBoIGFyZSBlaXRoZXIgMCBvciA+IDAiKTsKCQljb3V0IDw8ICJpbnN0YW5jaWF0ZWQgd2l0aCB3ID0gIiA8PCB3IDw8ICIsIGggPSAiIDw8IGggPDwgZW5kbDsKCX0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBDPFQsIDAsIDA+CnsKCXZvaWQgb3V0KCkKCXsKCQljb3V0IDw8ICJubyB3L2ggc3BlY2lmaWVkIiA8PCBlbmRsOwoJfQp9OwoKaW50IG1haW4oKQp7CglDPGludD4gY2ludDsKCWNpbnQub3V0KCk7CgkvL0M8aW50LCAxPiBjbnVtOyAvLyBmaXJlcyBzdGF0aWNfYXNzZXJ0LCBhcyBleHBlY3RlZAoJLy9jbnVtLm91dCgpOwoJQzxpbnQsIDEsIDE+IGNudW0yOwoJY251bTIub3V0KCk7CglyZXR1cm4gMDsKfQ==