#include <iostream>
struct DynamicSize {};
enum class SIZE_RANGE {SMALL, MEDIUM = 10, BIG = 100};
constexpr bool operator<(int size, SIZE_RANGE s) {
return size < (int)s;
}
//-------------------------------------------------------------------------
// FixedSize manages its own range selection here
template<int Size,
SIZE_RANGE SizeRange = (Size < SIZE_RANGE::MEDIUM? SIZE_RANGE::SMALL :
Size < SIZE_RANGE::BIG? SIZE_RANGE::MEDIUM :
SIZE_RANGE::BIG)>
struct FixedSize {};
//-------------------------------------------------------------------------
template<class T, class Size>
class Container;
template<class T>
class Container<T, FixedSize<0>> {
public:
Container() { std::cout << "Special case of FixedSize 0\n"; }
};
template<class T, int size>
class Container<T, FixedSize<size, SIZE_RANGE::SMALL>> {
public:
Container() { std::cout << "Small FixedSize: " << size << "\n"; }
};
template<class T, int size>
class Container<T, FixedSize<size, SIZE_RANGE::MEDIUM>> {
public:
Container() { std::cout << "Medium FixedSize: " << size << "\n"; }
};
template<class T, int size>
class Container<T, FixedSize<size, SIZE_RANGE::BIG>> {
public:
Container() { std::cout << "Big FixedSize: " << size << "\n"; }
};
template<class T>
class Container<T, DynamicSize> {
public:
Container() { std::cout << "dynamic size\n"; }
};
int main() {
Container<char, DynamicSize> a;
Container<char, FixedSize<0>> b;
Container<char, FixedSize<5>> c;
Container<char, FixedSize<42>> d;
Container<char, FixedSize<100>> e;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IER5bmFtaWNTaXplIHt9OwoKZW51bSBjbGFzcyBTSVpFX1JBTkdFIHtTTUFMTCwgTUVESVVNID0gMTAsIEJJRyA9IDEwMH07CmNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChpbnQgc2l6ZSwgU0laRV9SQU5HRSBzKSB7CglyZXR1cm4gc2l6ZSA8IChpbnQpczsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZpeGVkU2l6ZSBtYW5hZ2VzIGl0cyBvd24gcmFuZ2Ugc2VsZWN0aW9uIGhlcmUKdGVtcGxhdGU8aW50IFNpemUsIAogIFNJWkVfUkFOR0UgU2l6ZVJhbmdlID0gKFNpemUgPCBTSVpFX1JBTkdFOjpNRURJVU0/IFNJWkVfUkFOR0U6OlNNQUxMICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA8IFNJWkVfUkFOR0U6OkJJRz8gICAgU0laRV9SQU5HRTo6TUVESVVNIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX1JBTkdFOjpCSUcpPgpzdHJ1Y3QgRml4ZWRTaXplIHt9OwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFNpemU+CmNsYXNzIENvbnRhaW5lcjsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIENvbnRhaW5lcjxULCBGaXhlZFNpemU8MD4+IHsKcHVibGljOgogICAgQ29udGFpbmVyKCkgeyBzdGQ6OmNvdXQgPDwgIlNwZWNpYWwgY2FzZSBvZiBGaXhlZFNpemUgMFxuIjsgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVCwgaW50IHNpemU+CmNsYXNzIENvbnRhaW5lcjxULCBGaXhlZFNpemU8c2l6ZSwgU0laRV9SQU5HRTo6U01BTEw+PiB7CnB1YmxpYzoKICAgIENvbnRhaW5lcigpIHsgc3RkOjpjb3V0IDw8ICJTbWFsbCBGaXhlZFNpemU6ICIgPDwgc2l6ZSA8PCAiXG4iOyB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBULCBpbnQgc2l6ZT4KY2xhc3MgQ29udGFpbmVyPFQsIEZpeGVkU2l6ZTxzaXplLCBTSVpFX1JBTkdFOjpNRURJVU0+PiB7CnB1YmxpYzoKICAgIENvbnRhaW5lcigpIHsgc3RkOjpjb3V0IDw8ICJNZWRpdW0gRml4ZWRTaXplOiAiIDw8IHNpemUgPDwgIlxuIjsgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVCwgaW50IHNpemU+CmNsYXNzIENvbnRhaW5lcjxULCBGaXhlZFNpemU8c2l6ZSwgU0laRV9SQU5HRTo6QklHPj4gewpwdWJsaWM6CiAgICBDb250YWluZXIoKSB7IHN0ZDo6Y291dCA8PCAiQmlnIEZpeGVkU2l6ZTogIiA8PCBzaXplIDw8ICJcbiI7IH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIENvbnRhaW5lcjxULCBEeW5hbWljU2l6ZT4gewpwdWJsaWM6CiAgICBDb250YWluZXIoKSB7IHN0ZDo6Y291dCA8PCAiZHluYW1pYyBzaXplXG4iOyB9Cn07CgppbnQgbWFpbigpIHsKICAgIENvbnRhaW5lcjxjaGFyLCBEeW5hbWljU2l6ZT4gYTsKICAgIENvbnRhaW5lcjxjaGFyLCBGaXhlZFNpemU8MD4+IGI7CiAgICBDb250YWluZXI8Y2hhciwgRml4ZWRTaXplPDU+PiBjOwogICAgQ29udGFpbmVyPGNoYXIsIEZpeGVkU2l6ZTw0Mj4+IGQ7CiAgICBDb250YWluZXI8Y2hhciwgRml4ZWRTaXplPDEwMD4+IGU7Cn0=