C++中基于类型的模板函数

Sch*_*uah 7 c++ templates specialization differentiation

我想写一个故障安全访问的函数std::map.

在我的代码中的许多地方我想访问一个std::map按键,但是如果密钥不存在,我希望有一种默认值而不是异常(这是很多"无"的代码).

我写了这个基于模板的功能

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, T1 key, T2 defaultValue={})
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue;
};
Run Code Online (Sandbox Code Playgroud)

它很棒.但对于std::map<int, const char*>我想要有不同的行为.所以我可以添加这个专业化:

template <typename T1>
const char* mapGetByKey(std::map<T1, const char*>& map, T1 key, const char* defaultValue="")
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue;
};
Run Code Online (Sandbox Code Playgroud)

它也有效.但我认为这只是一个案例的代码.

有没有人知道如何保存行而不设置defaultValue来""进行调用std::map<int, const char*>

有没有办法在编译时区分类型,可能有一些ifdef或类似的东西?

Pio*_*cki 4

选项1

template <typename T>
T defaultValue()
{
    return {};
}

template <>
const char* defaultValue<const char*>()
{
    return "default string";
}

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, const T1& key)
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue<T2>();
}
Run Code Online (Sandbox Code Playgroud)

演示1

选项#2

template <typename T> struct identity { using type = T; };

template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, T1 key, const typename identity<T2>::type& defaultValue = {})
{
    auto it = map.find(key);

    if (it != map.end())
    {
        return it->second;
    }

    return defaultValue;
}

template <typename T1>
const char* mapGetByKey(std::map<T1, const char*>& map, const T1& key)
{
    return mapGetByKey(map, key, "default string");
}
Run Code Online (Sandbox Code Playgroud)

演示2