Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:两种类型的返回|模板_C++_Templates_Types_Return - Fatal编程技术网

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

C++ C++;:两种类型的返回|模板,c++,templates,types,return,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; }

我有一个函数,它应该返回一个类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;
}
#包括
模板
T&function(inti){
T res;
如果(i>0){
A res=1;
}
否则{
int res=5;
}
返回res;
}
int main(){
res1=函数(5);
int res2=函数(-5;)
返回0;
}

类型是静态的,在编译代码时确定,因此不能根据运行时值使用不同的返回类型。函数只能返回一种类型

一种选择是使用歧视性联盟;要支持的不同类型的并集,以及一个枚举值,用于指示哪种类型处于活动状态。如果您想要支持通用类类型,那么实现这一点是相当棘手的,因此您可能需要查看Boost的库。例如:

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
}
boost::变量函数(int i){
如果(i>0)
返回一个{1};
其他的
返回int{5};
}
int main(){
res1=boost::get(函数(5));
int res2=boost::get(函数(-5);
}
另一个选项可能是为不同类型提供一组回调函数,并在其中处理值,而不是返回值。例如:

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
}
模板
void函数(int i、回调和回调)
如果(i>0)
回调(A{1});
其他的
回调(int{5});
}
结构MyCallback{
void操作符()
void操作符()(int){/*使用int*/}
};
int main(){
MyCallback回调;
函数(5,回调);//调用
函数(-5,callback);//调用int的callback
}

您尝试执行的操作是不可能的。您的函数只能有一种返回类型。您可以通过引用传入一个A变量和一个整数变量,并由函数设置一个或另一个,但这是您能够获得的最接近的返回类型。不过,我不确定您尝试执行的操作。

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,您就知道填写的是哪一个了。

为什么您想这样做?函数参数是编译时常量表达式吗?如果
i
直到运行时才知道会发生什么?我知道这是不可能解决的我的问题是这样的,我需要找到另一种方法,无论如何谢谢大家:)事实上并非不可能。只是很难,需要一些额外的工作。我也想知道他到底想做什么。因为对于一个简单的问题来说,这似乎是一个糟糕的解决方案。@Omnipotentity现在只是在猜测,但可能是OP用于“动态类型”语言,例如LUA,在LUA中,这类事情是微不足道的。@Omnipotentity-除了返回包装器对象或类似的东西之外,我不知道怎么可能,我不知道我是否真的认为这是一个变量返回类型。除非有别的办法?按他想的方式做是不可能的,当然。