/*
 *
 * The output of this with gcc 4.7.2 is:
 *
 * 1
 * 2
 * this generic-int function should not be called
 * 0
 *
 *
 *
 * The output of this with gcc 4.6.3 is:
 *
 * 1
 * 2
 * this type-bool function SHOULD BE called
 * 1
 *
 */
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>

struct Type { int dummy; };

template <typename T, typename M>
inline T extractTag(const M &map, const char *key)
{
        if (!strcmp(key, "blah-bool"))
                std::cout << "this generic-int function should not be called" 
<< std::endl;
        T ret = 0;
        std::istringstream stream(extractTag<std::string>(map, key));
        stream >> ret;
        return ret;
}
template <typename M>
inline bool extractTag(const M &map, const char *key)
{
        if (!strcmp(key, "blah-bool"))
                std::cout << "this generic-bool function should not be called" 
<< std::endl;
        std::string str(extractTag<std::string>(map, key));
        std::transform(str.begin(), str.end(), str.begin(), ::tolower);
        return (str == "1" || str == "true");
}
template <>
inline unsigned int extractTag(const Type&, const char *key)
{
        return 2;
}
template <>
inline std::string extractTag(const Type&, const char *key)
{
        if (!strcmp(key, "blah-int"))
                return "1";
        if (!strcmp(key, "blah-unsigned-int"))
                return "-should-not-be-reached-";
        if (!strcmp(key, "blah-bool"))
                return "true";
        return "invalid";
}
template <>
inline bool extractTag(const Type&, const char *key)
{
        if (!strcmp(key, "blah-bool"))
                std::cout << "this type-bool function SHOULD BE called" << 
std::endl;
        return true;
}

int main(int argc, char *argv[])
{
        Type t;
        std::cout << extractTag<int>(t, "blah-int") << std::endl;
        std::cout << extractTag<unsigned int>(t, "blah-unsigned-int") << 
std::endl;
        std::cout << extractTag<bool>(t, "blah-bool") << std::endl;
        return 0;
}

Reply via email to