在C ++中使用模板时返回NULL

时间:2016-01-07 19:54:23

标签: c++ exception null

如果我有如下界面:

template <typename V, typename K>
V get(K key);  // Return the value of the key 

当找不到密钥时,规范&#34;是否返回NULL&#34;合理?除了抛出异常之外,还没有找到除钥匙之外的情况吗?

这也是抛出异常处理不存在的密钥的最佳方法吗?

1 个答案:

答案 0 :(得分:5)

您不能假设V是指针。例如,如果Vint,则return不能nullptr,因为它不是int的有效值。如果V是指针类型,请考虑nullptr是否为将其插入地图的有效值。如果是这样,调用者怎么能将nullptr return与“实际”nullptr中的“未找到”区分开来?

如果你没有return指向地图中项目的指针而不是副本,请考虑此签名。

template <typename V, typename K>
V * get(K key);

如果您不想让调用者修改地图中的对象,请使用const V *

或者,您可以使用optional<T>。您可以在Boost以及an experimental extension to the standard library中找到实施。

当然,您还可以throw一个例外来表明您的地图中没有该密钥。但是,如果您的客户有合理的方式提前知道密钥是否存在,那么大多数编码标准只会被认为是好的风格。应使用例外来表示异常,错误的情况。地图中不存在密钥的事实不太可能符合这一要求,除非在您的情况下,可以假设密钥集是已知的。