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

标签 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;
};

效果很好。但是对于 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;
};

它也有效。但我认为只有一种情况需要大量代码。

有没有人知道如何在不将默认值设置为 "" 的情况下保存行?调用 std::map<int, const char*>

有没有办法在编译时区分类型,也许用一些 ifdef还是类似的东西?

最佳答案

选项 #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>();
}

DEMO 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");
}

DEMO 2

关于c++ - C++ 中基于类型的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007632/

相关文章:

c++ - 将 typedef 转发声明到原始类型

c++ - LZMA C++ 大文件压缩问题

c++ - 没有函数模板的实例与参数列表匹配(试图打印数组)

C++ 模板特化链接器错误

c++ - 基于另一个已定义符号的条件#define

c++ - 带有 GCC 和 clang 的 constexpr char 数组

c# - 仅返回类型不同的 C++ 多个接口(interface)?

javascript - 为什么将我所有的 jquery 插件放入一个文件中不起作用?

c++ - 模板特化歧义 : either specialized or original method may be linked

c++ - 模板函数参数中的自动模板特化