#include <string>
#include <typeinfo>
using namespace std;
template <typename T>
static T StringCast(string inValue)
{
    if(typeid(T) == typeid(bool))
    {
        if(inValue == "true")
            return true;
        if(inValue == "false")
            return false;
        if(inValue == "1")
            return true;
        if(inValue == "0")
            return false;
        return false;
    }

    std::istringstream stream(inValue);
    T t;
    stream >> t;
    return t;
}

class Fail {
public:
};
std::istream& operator >> (std::istream& is, Fail&) { return is; }

int main()
{
   Fail f;
   f = StringCast<Fail>("HA");
}