您实际上有多种选择,特别是如果您愿意更改签名。
最有可能的是,您想发出错误信号,这里的异常非常有趣:
template <class Object>
const Object& SparseMat<Object>::get(int c, int r) const
{
if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity))
{
return mObjects[c][r];
}
throw UnknownCoordinates(c, r, cCapacity, rCapacity);
}
或者,更改签名,您可以包含无效性的概念:
template <class Object>
Object const* SparseMat<Object>::get(int c, int r) const
{
if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity))
{
return &mObjects[c][r];
}
return nullptr;
}
可以使用以下方法更明确boost::optional
:
template <class Object>
boost::optional<Object const&> SparseMat<Object>::get(int c, int r) const
{
if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity))
{
return mObjects[c][r];
}
return boost::none;
}
或者,在不更改签名的情况下,您可能希望使用空对象,但这几乎不是最佳选择(它将您限制为嵌入空概念的对象,并且此类对象最好重构为不具有空概念,而是依靠boost::optional<Object>
)
template <class Object>
const Object& SparseMat<Object>::get(int c, int r) const
{
if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity))
{
return mObjects[c][r];
}
return null; // where null is "static Object const null;" for example.
}