我想为给定的KEY for the<>返回一个VALUE在c ++中。如果地图中没有KEY<>?

时间:2012-03-08 17:50:28

标签: c++ templates map return-value

我用模板写了课。 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,可以是任何取决于用户决策的东西。 我怎么能取代“???”和什么?

4 个答案:

答案 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)

您的选择是三个:

  1. throw例外
  2. 修改签名,以便您可以返回带外数据(这是@JaredPar suggests
  3. 返回带内数据。
  4. 如果必须选择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,或者 无论你怎么称呼它);虽然一般来说是一个很好的解决方案,但似乎 这里太过分了。或者最后,你可以简单地抛出异常 对象不存在。