【问题标题】:what should I return if I don't have something to return for an unknown type如果我没有返回未知类型的东西,我应该返回什么
【发布时间】:2012-02-20 11:22:31
【问题描述】:

对于下面的代码,如果我没有东西要返回,我应该返回什么?目前,我做了类似 T() 的事情,但我不确定它是否正确和正确。

template<typename T1, typename T2>
tuple<T1, T2, bool> CBR<T1, T2>::getSomething(T1 t)
{
    // here I I don't have something of time T2 or T2 to return
    if( ... )
        return make_tuple(T1(), T2(), false); // @FIXME

    if( ... )
        return make_tuple(something.tp, something.ts, false);
    else
        return make_tuple(something.tp, something.ts, true);
}

【问题讨论】:

  • 那是design question。如果不能返回某些东西,supposed 应该返回什么函数?
  • 你知道boost::optional吗?
  • 顺便说一句,最后 4 行应该只是 return make_tuple(something.tp, something.ts, !(...));
  • @FredOverflow 使用 boost::optional 即使不需要 T1 和 T2,我也想返回 false,以便调用它的用户知道他不应该计算 T1 和 T2 例如(因为实际上没有 T1 和 T2)。有可能吗?
  • 那么当boolean为false时,就没有真正的T1和T2部分了?听起来你想要一个boost::optional&lt;pair&lt;T1, T2&gt; &gt;

标签: c++ methods return optional typename


【解决方案1】:
boost::optional<tuple<T1, T2, bool> >

“好的”返回路径将保持不变; “FIXME”将变为:

return boost::none;

这可以让您的类与不支持默认构造的类型一起使用。

【讨论】:

  • 对于代码的 FIXME 部分,不需要 T1 和 T2 但我想返回 false,以便调用它的用户知道他不应该计算 T1 和 T2 例如(因为那里实际上没有 T1 和 T2)。
  • 如何测试该方法返回了什么或没有返回什么?我们应该使用类似的东西: if( obj.getSomething(t) != boost::none ) tie(var1, va2, var3) = obj.getSomething(t);
  • if (boost::optional&lt;tuple&lt;...&gt; &gt; result = obj.getSomething(t)) tie(var1, var2, var3) = *result;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多