#include <string>
#include <type_traits>
struct Ip
{
std::string ip;
};
template <typename T>
typename std::enable_if<!std::is_integral<T>::value && !std::is_floating_point<T>::value, bool>::type
Equal(const std::string& s, const T& data)
{return s == data;}
template <typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
Equal(const std::string& s, const T& data)
{
//int specific
return false;
}
template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, bool>::type
Equal(const std::string& s, const T& data)
{
//Float specific
return false;
}
bool Equal(const std::string& s, const Ip& data)
{
//Ip specific
return false;
}
int main()
{
Equal("21", 21);
Equal("21", 21.f);
Equal("21","42.5");
Equal("21", Ip{"21"});
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKc3RydWN0IElwCnsKICAgIHN0ZDo6c3RyaW5nIGlwOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiAhc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCkVxdWFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBUJiBkYXRhKQp7cmV0dXJuIHMgPT0gZGF0YTt9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCkVxdWFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBUJiBkYXRhKQp7CiAgICAvL2ludCBzcGVjaWZpYwogICAgcmV0dXJuIGZhbHNlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCkVxdWFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBUJiBkYXRhKQp7CiAgICAvL0Zsb2F0IHNwZWNpZmljCiAgICByZXR1cm4gZmFsc2U7Cn0KCmJvb2wgRXF1YWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IElwJiBkYXRhKQp7CiAgIC8vSXAgc3BlY2lmaWMKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKQp7CiAgICBFcXVhbCgiMjEiLCAyMSk7CiAgICBFcXVhbCgiMjEiLCAyMS5mKTsKICAgIEVxdWFsKCIyMSIsIjQyLjUiKTsKICAgIEVxdWFsKCIyMSIsIElweyIyMSJ9KTsKCiAgICByZXR1cm4gMDsKfQo=