我有一个函数应该返回类A的对象,如果我是正数,则返回一个整数。 这是一个强大的简化示例,我不能使用重载!
#include <iostream>
template <typename T>
T& function(int i){
T res;
if (i>0){
A res = 1;
}
else{
int res = 5;
}
return res;
}
int main(){
A res1 = function(5);
int res2 = function(-5;)
return 0;
}
答案 0 :(得分:2)
类型是静态的,在编译代码时确定,因此根据运行时值,您不能具有不同的返回类型。一个函数只能返回一种类型。
一种选择是使用歧视联盟;要支持的不同类型的并集,以及用于指示哪个类型处于活动状态的枚举值。如果您想支持常规类类型,那么实现起来非常棘手,因此您可能希望查看Boost的Variant库。例如:
boost::variant<int,T> function(int i) {
if (i>0)
return A{1};
else
return int{5};
}
int main() {
A res1 = boost::get<A>(function(5));
int res2 = boost::get<int>(funtion(-5);
}
另一种选择可能是为不同类型提供一组回调函数,并在那里处理值而不是返回它。例如:
template <typename Callback>
void function(int i, Callback & callback)
if (i>0)
callback(A{1});
else
callback(int{5});
}
struct MyCallback {
void operator()(A const &) {/* do something with A */}
void operator()(int) {/* do something with int */}
};
int main() {
MyCallback callback;
function(5, callback); // calls callback for A
function(-5, callback); // calls callback for int
}
答案 1 :(得分:0)
你要做的事是不可能的。您的函数只能有一种返回类型。你可以通过引用传递一个A变量和一个整数变量,并且由函数设置一个或另一个,但这是你能够得到的最接近的。我不太确定你想要完成什么。
答案 2 :(得分:0)
C ++根本不支持这个。
更好的解决方案是:
bool function(int i, int &intResult, A &AResult)
{
if (i > 0)
{
AResult = A(1);
// Or whatever other code you need to place the result in AResult
return true;
}
intResult = 5;
return false;
}
你需要传递一个int和一个A来接收可能的返回值,并且通过检查返回的bool,你知道哪一个被填充。