使用模板时,如果我有一个界面如下:返回NULL在C++
template <typename V, typename K>
V get(K key); // Return the value of the key
是否规范“返回NULL当钥匙未找到”有意义吗?有没有办法处理的情况下,除了抛出异常没有找到钥匙?
也是抛出一个异常这里处理不存在的密钥的最佳方式?
使用模板时,如果我有一个界面如下:返回NULL在C++
template <typename V, typename K>
V get(K key); // Return the value of the key
是否规范“返回NULL当钥匙未找到”有意义吗?有没有办法处理的情况下,除了抛出异常没有找到钥匙?
也是抛出一个异常这里处理不存在的密钥的最佳方式?
你不能认为V
是一个指针。例如,如果V
是int
,则不能return
nullptr
,因为它对于int
无效。如果V
是指针类型,请考虑nullptr
是否是一个有效的值,以便将其插入到您的地图中。如果是这样,来电者如何区分nullptr
即return
ed表示“未找到”与“实际”nullptr
?
如果您还好,return
指向地图中的项目而不是副本,请考虑此签名。
template <typename V, typename K>
V * get(K key);
使用const V *
如果你宁愿没有来电修改对象在地图中。
或者,您可以使用optional<T>
。您可以在Boost以及an experimental extension to the standard library中找到实现。
当然,您也可以使用throw
作为例外,以表明密钥不在您的地图中。然而,如果你的客户有一个合理的方法提前知道密钥是否存在,那么只有大多数编码标准认为这是好的风格。应该使用例外来表示异常,错误的情况。在地图中不存在密钥的事实不太可能符合此条件,除非在您的情况下,可以假定该组密钥是已知的。
谢谢你的回复。我只是想知道抛出异常是处理不存在密钥的最佳方式吗? – ZigZagZebra
@ZigZagZebra你可以做到,但它可能不会是“最好的方式”。请参阅最新的答案。 – 5gon12eder
那么如果你可以使用迭代器方法并将迭代器返回给元素。如果元素不存在,则返回一个哨兵迭代器。 – NathanOliver
如果'V'不是指针? –
如果'V'是一个指针类型,则可以返回NULL,否则返回NULL。 –