2016-01-07 62 views
4

使用模板时,如果我有一个界面如下:返回NULL在C++

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

是否规范“返回NULL当钥匙未找到”有意义吗?有没有办法处理的情况下,除了抛出异常没有找到钥匙?

也是抛出一个异常这里处理不存在的密钥的最佳方式?

+1

那么如果你可以使用迭代器方法并将迭代器返回给元素。如果元素不存在,则返回一个哨兵迭代器。 – NathanOliver

+0

如果'V'不是指针? –

+0

如果'V'是一个指针类型,则可以返回NULL,否则返回NULL。 –

回答

5

你不能认为V是一个指针。例如,如果Vint,则不能returnnullptr,因为它对于int无效。如果V是指针类型,请考虑nullptr是否是一个有效的值,以便将其插入到您的地图中。如果是这样,来电者如何区分nullptrreturn 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作为例外,以表明密钥不在您的地图中。然而,如果你的客户有一个合理的方法提前知道密钥是否存在,那么只有大多数编码标准认为这是好的风格。应该使用例外来表示异常,错误的情况。在地图中不存在密钥的事实不太可能符合此条件,除非在您的情况下,可以假定该组密钥是已知的。

+0

谢谢你的回复。我只是想知道抛出异常是处理不存在密钥的最佳方式吗? – ZigZagZebra

+1

@ZigZagZebra你可以做到,但它可能不会是“最好的方式”。请参阅最新的答案。 – 5gon12eder