C ++:两种类型的返回|模板

时间:2014-10-28 16:28:52

标签: c++ templates types return

我有一个函数应该返回类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;
}

3 个答案:

答案 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,你知道哪一个被填充。