template<class T, class D>
class switch_with_default;
template<class T>
class switch_impl {
public:
switch_impl(const T& t_) : t(&t_), matched(false) {}
template<class U, class F>
switch_impl& case_(const U& u, const F& f) {if(!matched&&*t==u){matched=true;f();}return *this;}
template<class D>
switch_with_default<T,D> default_(const D& d);
protected:
template<class U, class D>
friend class switch_with_default;
const T* t;
bool matched;
};
template<class T, class D>
class switch_with_default {
public:
template<class U, class F>
switch_with_default& case_(const U& u, const F& f) {impl->case_(u,f); return *this;}
~switch_with_default() {if (!impl->matched) (*d)();}
protected:
friend switch_impl<T>;
switch_with_default(switch_impl<T>& impl_, const D& d_) :impl(&impl_), d(&d_) {}
switch_impl<T>* impl;
const D* d;
};
template<class T> template<class D>
switch_with_default<T,D> switch_impl<T>::default_(const D& d) {return switch_with_default<T,D>(*this, d);}
template<class T>
switch_impl<T> switch_(const T& t) {return switch_impl<T>(t);}
#include <iostream>
int main() {
std::string input = "MooingDuck";
switch_(input)
.case_("First", [](){std::cout << "FAILURE1\n";})
.case_("MooingDuck", [](){std::cout << "SUCCESS\n";})
.case_("Third", [](){std::cout << "FAILURE2\n";});
switch_(input)
.case_("First", [](){std::cout << "FAILURE1\n";})
.default_([](){std::cout << "SUCCESS\n";})
.case_("Third", [](){std::cout << "FAILURE2\n";});
}
dGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgRD4KY2xhc3Mgc3dpdGNoX3dpdGhfZGVmYXVsdDsKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3Mgc3dpdGNoX2ltcGwgewpwdWJsaWM6CiAgICBzd2l0Y2hfaW1wbChjb25zdCBUJiB0XykgOiB0KCZ0XyksIG1hdGNoZWQoZmFsc2UpIHt9CiAgICB0ZW1wbGF0ZTxjbGFzcyBVLCBjbGFzcyBGPgogICAgc3dpdGNoX2ltcGwmIGNhc2VfKGNvbnN0IFUmIHUsIGNvbnN0IEYmIGYpIHtpZighbWF0Y2hlZCYmKnQ9PXUpe21hdGNoZWQ9dHJ1ZTtmKCk7fXJldHVybiAqdGhpczt9CiAgICB0ZW1wbGF0ZTxjbGFzcyBEPgogICAgc3dpdGNoX3dpdGhfZGVmYXVsdDxULEQ+IGRlZmF1bHRfKGNvbnN0IEQmIGQpOwpwcm90ZWN0ZWQ6CiAgICB0ZW1wbGF0ZTxjbGFzcyBVLCBjbGFzcyBEPiAKICAgIGZyaWVuZCBjbGFzcyBzd2l0Y2hfd2l0aF9kZWZhdWx0OwogICAgY29uc3QgVCogdDsKICAgIGJvb2wgbWF0Y2hlZDsKfTsKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgRD4KY2xhc3Mgc3dpdGNoX3dpdGhfZGVmYXVsdCB7CnB1YmxpYzoKICAgIHRlbXBsYXRlPGNsYXNzIFUsIGNsYXNzIEY+CiAgICBzd2l0Y2hfd2l0aF9kZWZhdWx0JiBjYXNlXyhjb25zdCBVJiB1LCBjb25zdCBGJiBmKSB7aW1wbC0+Y2FzZV8odSxmKTsgcmV0dXJuICp0aGlzO30KICAgIH5zd2l0Y2hfd2l0aF9kZWZhdWx0KCkge2lmICghaW1wbC0+bWF0Y2hlZCkgKCpkKSgpO30KcHJvdGVjdGVkOgogICAgZnJpZW5kIHN3aXRjaF9pbXBsPFQ+OwogICAgc3dpdGNoX3dpdGhfZGVmYXVsdChzd2l0Y2hfaW1wbDxUPiYgaW1wbF8sIGNvbnN0IEQmIGRfKSA6aW1wbCgmaW1wbF8pLCBkKCZkXykge30KICAgIHN3aXRjaF9pbXBsPFQ+KiBpbXBsOwogICAgY29uc3QgRCogZDsKfTsKdGVtcGxhdGU8Y2xhc3MgVD4gdGVtcGxhdGU8Y2xhc3MgRD4Kc3dpdGNoX3dpdGhfZGVmYXVsdDxULEQ+IHN3aXRjaF9pbXBsPFQ+OjpkZWZhdWx0Xyhjb25zdCBEJiBkKSB7cmV0dXJuIHN3aXRjaF93aXRoX2RlZmF1bHQ8VCxEPigqdGhpcywgZCk7fQp0ZW1wbGF0ZTxjbGFzcyBUPgpzd2l0Y2hfaW1wbDxUPiBzd2l0Y2hfKGNvbnN0IFQmIHQpIHtyZXR1cm4gc3dpdGNoX2ltcGw8VD4odCk7fQoKCgoKCiNpbmNsdWRlIDxpb3N0cmVhbT4KaW50IG1haW4oKSB7CiAgICBzdGQ6OnN0cmluZyBpbnB1dCA9ICJNb29pbmdEdWNrIjsKICAgIAogICAgc3dpdGNoXyhpbnB1dCkKICAgIC5jYXNlXygiRmlyc3QiLCBbXSgpe3N0ZDo6Y291dCA8PCAiRkFJTFVSRTFcbiI7fSkKICAgIC5jYXNlXygiTW9vaW5nRHVjayIsIFtdKCl7c3RkOjpjb3V0IDw8ICJTVUNDRVNTXG4iO30pCiAgICAuY2FzZV8oIlRoaXJkIiwgW10oKXtzdGQ6OmNvdXQgPDwgIkZBSUxVUkUyXG4iO30pOwogICAgCiAgICBzd2l0Y2hfKGlucHV0KQogICAgLmNhc2VfKCJGaXJzdCIsIFtdKCl7c3RkOjpjb3V0IDw8ICJGQUlMVVJFMVxuIjt9KQogICAgLmRlZmF1bHRfKFtdKCl7c3RkOjpjb3V0IDw8ICJTVUNDRVNTXG4iO30pCiAgICAuY2FzZV8oIlRoaXJkIiwgW10oKXtzdGQ6OmNvdXQgPDwgIkZBSUxVUkUyXG4iO30pOwp9CgoK