我用模板写了课。 class有map作为成员,有些getxxx()/ setxxx()成员函数。
template<typename T1,typename T2>
class C1{
map<T1,T2> M;
public:
map<T1,T2> getM();
T2 getMvalue(T1 Key);
void setM(T1 key,T2 Value);
};
这里我想实现getMvalue(),它接收key作为参数,如果mapM中有“key”,则返回相应的“value”。
看起来像......
template<typename TKey,typename TValue>
T2 C1<T1,T2>::getMvalue(T1 Key){
if(M.count(Key)>0)
return M[Key];
else
return(???);
};
这里我需要用某种东西代替???。请记住,返回类型的函数是T2,可以是任何取决于用户决策的东西。 我怎么能取代“???”和什么?
答案 0 :(得分:3)
我建议您使用TryGet
模式
template<typename TKey,typename TValue>
bool C1<T1,T2>::tryGetMvalue(T1 key, T2& value){
if(M.count(key)>0) {
value = objProperties[key];
return true;
}
return false;
};
答案 1 :(得分:2)
您的选择是三个:
throw
例外如果必须选择3,我会返回默认值(这是std::map::operator[]
所做的):
template<typename TKey,typename TValue>
T2 C1<T1,T2>::getMvalue(T1 Key){
if(M.count(Key)>0)
return M[Key];
else
return T2();
};
请注意,设计选择#3会导致错误。呼叫者无法区分“名义价值”和“不存在”。
<小时/> 附:如果确实返回了默认值,那么您的代码可能会简化为:
template<typename TKey,typename TValue>
T2 C1<T1,T2>::getMvalue(T1 Key){
return M[key];
}
答案 2 :(得分:2)
通过使用operator[]
,您已经限制自己只存储默认可构造的值;所以你可以返回TKey()
- 除非用户需要能够判断它是否真的被发现。
如果您不想要这个限制,那么您必须将其更改为:
auto found = map.find(key);
if (found != map.end()) {
return found->second;
} else {
return ???;
}
现在指示失败的最简单方法是将返回类型更改为指针(如果要按值返回,则可能是boost::optional
),并返回null(或boost::none
);或者通过引用参数返回结果,并用布尔返回值表示成功;或者抛出异常。
答案 3 :(得分:1)
几种可能性。最简单的是让getter返回a 指针,如果键不在地图中,则使用空指针。 或者,你可以让它返回一个Fallible(或者Maybe,或者 无论你怎么称呼它);虽然一般来说是一个很好的解决方案,但似乎 这里太过分了。或者最后,你可以简单地抛出异常 对象不存在。