2012-01-27 73 views
0

对于下面的代码,如果我没有东西要返回,应该返回什么?目前,我做了类似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); 
} 
+2

这是[设计问题](http://stackoverflow.com/a/1755380/140719)。如果它不能返回什么,_supposed_返回的函数是什么? – sbi 2012-01-27 13:24:36

+0

你知道'boost :: optional'吗? – fredoverflow 2012-01-27 13:27:40

+0

顺便说一句,最后4行应该是'return make_tuple(something.tp,something.ts,!(...));' – MSalters 2012-01-27 13:57:36

回答

2
boost::optional<tuple<T1, T2, bool> > 

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

return boost::none; 

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

+0

对于代码的FIXME部分,不需要T1和T2,但我想返回false,以便调用此函数的用户知道他不应该输出T1和T2(因为实际上没有T1和T2) 。 – shn 2012-01-27 14:25:03

+0

如何测试该方法返回了什么或没有返回任何东西?我们应该使用如下所示:if(obj.getSomething(t)!= boost :: none)tie(var1,va2,var3)= obj.getSomething(t); – shn 2012-01-28 19:34:29

+0

'if(boost :: optional > result = obj.getSomething(t))tie(var1,var2,var3)= * result;' – 2012-01-30 16:21:02

相关问题