代码之家  ›  专栏  ›  技术社区  ›  George Godik

模板类型定义-你的工作是什么?

  •  73
  • George Godik  · 技术社区  · 17 年前

    C++0x有模板别名(有时称为模板类型定义)。看见 here 当前的C++规范没有。

    你喜欢用什么作为变通办法?容器对象还是宏? 你觉得值得吗?

    3 回复  |  直到 13 年前
        1
  •  103
  •   Konrad Rudolph    16 年前

    你喜欢用什么作为变通办法?容器对象还是宏?你觉得值得吗?

    规范的方法是使用这样的元函数:

    template <typename T>
    struct my_string_map {
        typedef std::map<std::string, T> type;
    };
    
    // Invoke:
    
    my_string_map<int>::type my_str_int_map;
    

    这也用于STL( allocator::rebind<U> )在包括Boost在内的许多库中。我们广泛使用它 bioinformatical library .

    它很臃肿,但99%的时间都是最好的选择。在这里使用宏不值得有很多缺点。

    (编辑:我已经修改了代码,以反映Daniel在评论中指出的Boost/STL约定。)

        2
  •  11
  •   xghost    15 年前
    template <typename T>
    struct my_string_map : public std::map<std::string,T> 
    {
    };
    

    你不应该从没有虚拟析构函数的类继承。这与派生类中的析构函数在应该调用的时候没有被调用有关,你最终可能会得到未分配的内存。

    话虽如此,在上面的例子中,你可能会逃脱惩罚,因为你没有向派生类型添加更多数据。请注意,这不是背书。我仍然建议你 do not 的常用口语形式 做吧。事实上,你 这不是指你吗 本应 .

    编辑:是的,这是对ShaChris23帖子的回复。我可能错过了一些东西,因为它出现在他/她的消息上方而不是下方。

        3
  •  0
  •   Andrei Pokrovsky    10 年前

    有时,你可以明确地写出所有必要类型的未模板类型。如果基类是在多个模板参数上模板化的,并且只需要对一个类型进行typedef,则可以继承一个专门的类,其中typedef有效地包含在继承的类名中。这种方法比元函数方法更不深奥。