c++ - 降低 C++ 中的模板复杂性

标签 c++ c++11 visual-studio-2010

最近,我一直在使用一种较少使用的 STL 功能 - 自定义分配器,我需要一些认真的帮助来减少我的语义开销。以无序映射的定义为例,它将文件名映射到一对整数的无序映射,并将 shared_ptr 映射到 token ,但使用自定义分配器。

typedef std::pair<int, int> token_key_type;
typedef std::unordered_map<
    token_key_type, 
    std::shared_ptr<Token>,
    std::hash<token_key_type>,
    std::equal_to<token_key_type>,
    Allocator<
        std::pair<
            const token_key_type, 
            std::shared_ptr<
                Token
            >
        >
    >
> filename_map_value_type;
std::unordered_map<
    string, 
    filename_map_value_type,
    std::hash<string>,
    std::equal_to<string>,
    Allocator<
        std::pair<
            const string, 
            filename_map_value_type
        >
    >
> tokens;

那是404个字符的定义。然后要构造它,我必须为每个模板参数传递默认值,除了不能默认构造的分配器和不存在定义的存储桶计数,导致另外 168 个字符仅用于构造该死的东西。另外,当然,每次我想插入时都一样,因为第一个映射的值类型也必须这样构造。

有什么方法可以避免所有这些而不必编写我自己的 unordered_map?它开始严重降低我的工作效率。

编辑:抱歉!我的意思是,一般来说,对于 STL 容器,不仅仅是 unordered_map 具体来说,这只是最坏的情况。我也遇到了常规映射、unordered_set 等问题,无法编写一个函数来为我可能单独需要的所有可能的 STL 容器执行所有这些操作。

最佳答案

icecrime 的解决方案也可以通过下面的代码在旧的编译器上完成,只是略显丑陋。您还可以添加工厂函数来简化构造。

template<typename K, typename V> struct unordered_map_type
{
    typedef std::unordered_map<
        K, 
        V,
        std::hash<K>,
        std::equal_to<K>,
        Allocator<
            std::pair<const K, V>
        >
    > type;
};

typedef std::pair<int, int> token_key_type;
typedef unordered_map_type<token_key_type, std::shared_ptr<Token> >::type filename_map_value_type;

关于c++ - 降低 C++ 中的模板复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354004/

相关文章:

C++ 模板函数 - 多种类型、默认值和...参数?

c++ - 迭代插入到二叉搜索树中。调试 C++ 代码

c++ - 如何为 Linux 重新分发已编译的专有软件?

c++ - "is-implemented-in-terms-of"是什么关系,我应该什么时候使用它?

c++ - 将一个函数元组应用于一个值并返回一个元组

c++11 - 在 vector::emplace_back 中就地构造 std::pair

c# - Windows 窗体 PictureBox - 如何在窗体的特定区域显示图像

c# - 如何正确处理自定义控件中的引用

c# - 引用的项目和配置文件

c++ - libSpatialIndex:在磁盘上加载/存储索引