template <
typename Handler,
typename In,
typename Out,
bool IsConst = false>
struct ContractOperator;
template <
typename Handler,
typename In,
typename Out>
struct ContractOperator<Handler, In, Out, true>
{
typedef Out(Handler::*type)(In) const;
};
template <
typename Handler,
typename In,
typename Out>
struct ContractOperator<Handler, In, Out, false>
{
typedef Out(Handler::*type)(In);
};
template <
typename In,
typename Out,
typename Handler>
std::true_type ConstnessCheck2(typename detail::ContractOperator<Handler, In, Out, true>::type op);
template <
typename In,
typename Out,
typename Handler>
std::false_type ConstnessCheck2(typename detail::ContractOperator<Handler, In, Out, false>::type op);
std::is_same<std::true_type, decltype(ConstnessCheck2<int, std::string, ClassWithConstMethod>(&ClassWithConstMethod::SpellThisNumber))>::value;
CiAgICAgICAgdGVtcGxhdGUgPAogICAgICAgICAgICB0eXBlbmFtZSBIYW5kbGVyLAogICAgICAgICAgICB0eXBlbmFtZSBJbiwKICAgICAgICAgICAgdHlwZW5hbWUgT3V0LAogICAgICAgICAgICBib29sIElzQ29uc3QgPSBmYWxzZT4KICAgICAgICBzdHJ1Y3QgQ29udHJhY3RPcGVyYXRvcjsKCgogICAgICAgIHRlbXBsYXRlIDwKICAgICAgICAgICAgdHlwZW5hbWUgSGFuZGxlciwKICAgICAgICAgICAgdHlwZW5hbWUgSW4sCiAgICAgICAgICAgIHR5cGVuYW1lIE91dD4KICAgICAgICBzdHJ1Y3QgQ29udHJhY3RPcGVyYXRvcjxIYW5kbGVyLCBJbiwgT3V0LCB0cnVlPgogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBPdXQoSGFuZGxlcjo6KnR5cGUpKEluKSBjb25zdDsKICAgICAgICB9OwoKICAgICAgICB0ZW1wbGF0ZSA8CiAgICAgICAgICAgIHR5cGVuYW1lIEhhbmRsZXIsCiAgICAgICAgICAgIHR5cGVuYW1lIEluLAogICAgICAgICAgICB0eXBlbmFtZSBPdXQ+CiAgICAgICAgc3RydWN0IENvbnRyYWN0T3BlcmF0b3I8SGFuZGxlciwgSW4sIE91dCwgZmFsc2U+CiAgICAgICAgewogICAgICAgICAgICB0eXBlZGVmIE91dChIYW5kbGVyOjoqdHlwZSkoSW4pOwogICAgICAgIH07CgogICAgdGVtcGxhdGUgPAogICAgICAgIHR5cGVuYW1lIEluLCAKICAgICAgICB0eXBlbmFtZSBPdXQsIAogICAgICAgIHR5cGVuYW1lIEhhbmRsZXI+CiAgICBzdGQ6OnRydWVfdHlwZSBDb25zdG5lc3NDaGVjazIodHlwZW5hbWUgZGV0YWlsOjpDb250cmFjdE9wZXJhdG9yPEhhbmRsZXIsIEluLCBPdXQsIHRydWU+Ojp0eXBlIG9wKTsKICAgIAogICAgdGVtcGxhdGUgPAogICAgICAgIHR5cGVuYW1lIEluLCAKICAgICAgICB0eXBlbmFtZSBPdXQsIAogICAgICAgIHR5cGVuYW1lIEhhbmRsZXI+CiAgICBzdGQ6OmZhbHNlX3R5cGUgQ29uc3RuZXNzQ2hlY2syKHR5cGVuYW1lIGRldGFpbDo6Q29udHJhY3RPcGVyYXRvcjxIYW5kbGVyLCBJbiwgT3V0LCBmYWxzZT46OnR5cGUgb3ApOwogICAgCiAgICBzdGQ6OmlzX3NhbWU8c3RkOjp0cnVlX3R5cGUsIGRlY2x0eXBlKENvbnN0bmVzc0NoZWNrMjxpbnQsIHN0ZDo6c3RyaW5nLCBDbGFzc1dpdGhDb25zdE1ldGhvZD4oJkNsYXNzV2l0aENvbnN0TWV0aG9kOjpTcGVsbFRoaXNOdW1iZXIpKT46OnZhbHVlOw==