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

您喜欢用什么来解决问题?容器对象还是宏?你觉得值得吗?

有帮助吗?

解决方案

您喜欢用什么来解决问题?容器对象还是宏?你觉得值得吗?

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

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。我们广泛使用它 生物信息库.

它有点臃肿,但 99% 的情况下它是最好的选择。在这里使用宏不值得带来许多缺点。

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

其他提示

template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

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

话虽如此,在上面的实例中您可能*****可能*****逃脱它,因为您没有向派生类型添加任何更多数据。请注意,这不是认可。我还是劝你 做吧。事实是你 这样做并不意味着你 应该.

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

有时,您可以显式地写出所有必要类型的非模板化类型定义。如果基类在多个模板参数上进行模板化,并且只有一种类型需要进行 typedefed,则您可以继承一个专用类,并将 typedef 有效地包含在继承的类名中。这种方法没有元函数方法那么深奥。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top