C++ 显式返回模板参数

C++ 显式返回模板参数,c++,c++14,C++,C++14,我有一个函数,它接受一个auto并返回一个auto。此函数采用数字类型,例如复数、整数或双精度。但是,根据函数的结果,我需要显式返回一些内容。例如,如果一个复数被传递给函数,我需要返回complex0,如果这个数的实部小于零。代码如下所示: if(myNumber<0){ return 0.0;} else{ return myNumber; } 现在当然我必须重载小于运算符,但困难的部分是如何在myNumber不是双精度的情况下允许返回0。我重载了=运算符以允许将双精度赋值给复数,但是

我有一个函数,它接受一个auto并返回一个auto。此函数采用数字类型,例如复数、整数或双精度。但是,根据函数的结果,我需要显式返回一些内容。例如,如果一个复数被传递给函数,我需要返回complex0,如果这个数的实部小于零。代码如下所示:

if(myNumber<0){ return 0.0;} else{ return myNumber; }
现在当然我必须重载小于运算符,但困难的部分是如何在myNumber不是双精度的情况下允许返回0。我重载了=运算符以允许将双精度赋值给复数,但是仍然会出现编译错误

有什么好办法可以做到这一点吗

编辑:

我的完整代码如下所示

auto BSCall(const auto &S0, const auto &k, const auto &discount, const auto &sigma){ 
if(sigma<=0){
    return 0.0;
}
else{
    double s=sqrt(2.0);
    auto d1=log(S0/(discount*k))/(sigma)+sigma*.5;
    return S0*(.5+.5*erf(d1/s))-k*discount*(.5+.5*(erf((d1-sigma)/s)));  
}}
再次编辑:

事实证明,我没有让我的类有一个双精度的构造函数。当运算符=重载且构造函数只有一个double时,我的代码就能工作

我认为有两种方法:

首先是尝试初始化列表:

if(myNumber<0){
    return {};   //  <= it means you return T()
}else{
    return myNumber;
}
当然,您的函数是模板化的,所以我不确定第二种方法是否有效。请从您的项目中发布其他代码,以便我能够告诉您如何在您的案例中使用std::result\u。

我看到两种方法:

首先是尝试初始化列表:

if(myNumber<0){
    return {};   //  <= it means you return T()
}else{
    return myNumber;
}

当然,您的函数是模板化的,所以我不确定第二种方法是否有效。请从您的项目中发布其他代码,以便我能够告诉您如何在您的案例中使用std::result\u。

我认为您遇到了问题,因为您有两个返回不同的类型,而编译器无法决定使用哪种类型作为返回类型

您可以通过将计算结果放入辅助函数来解决此问题:

auto BSCallHelper(
        const auto &S0,
        const auto &k,
        const auto &discount,
        const auto &sigma
        )
{
    double s=sqrt(2.0);
    auto d1=log(S0/(discount*k))/(sigma)+sigma*.5;
    return S0*(.5+.5*erf(d1/s))-k*discount*(.5+.5*(erf((d1-sigma)/s))); 
}
然后可以使用helper函数使返回类型显式:

auto BSCall(
        const auto &S0,
        const auto &k,
        const auto &discount,
        const auto &sigma
        ) -> decltype(BSCallHelper(S0,k,discount,sigma))
{ 
    if(sigma<=0){
        return 0.0;
    }

    return BSCallHelper(S0,k,discount,sigma);
}

我认为您遇到了问题,因为您有两个返回不同的类型,而编译器无法决定使用哪种类型作为返回类型

您可以通过将计算结果放入辅助函数来解决此问题:

auto BSCallHelper(
        const auto &S0,
        const auto &k,
        const auto &discount,
        const auto &sigma
        )
{
    double s=sqrt(2.0);
    auto d1=log(S0/(discount*k))/(sigma)+sigma*.5;
    return S0*(.5+.5*erf(d1/s))-k*discount*(.5+.5*(erf((d1-sigma)/s))); 
}
然后可以使用helper函数使返回类型显式:

auto BSCall(
        const auto &S0,
        const auto &k,
        const auto &discount,
        const auto &sigma
        ) -> decltype(BSCallHelper(S0,k,discount,sigma))
{ 
    if(sigma<=0){
        return 0.0;
    }

    return BSCallHelper(S0,k,discount,sigma);
}


我有一个函数,它接受一个auto并返回一个auto。这在C++14中是不存在的。您使用的是GCC扩展吗?您的复杂类型是std::complex吗?不,我创建了自己的类……我希望它也适用于其他数字类型。@T.C.OP谈论的是尾随返回type@AngelusMortis听起来不像。除此之外,问题在于接受一个自动,而不是返回一个自动。我有一个函数,接受一个自动并返回一个自动。这在C++14中是不存在的。您使用的是GCC扩展吗?您的复杂类型是std::complex吗?不,我创建了自己的类……我希望它也适用于其他数字类型。@T.C.OP谈论的是尾随返回type@AngelusMortis听起来不像。除此之外,问题在于使用自动,而不是返回自动。编辑:我仍然得到原始错误无法从'double'@user9403转换'0.0'。您使用的编译器和版本是什么?我使用的是gcc 5.2.1。我应该补充一点,当我使用double时,就像在您的示例中一样,它会编译,只有当我使用a类而不是基元时,它才不会编译。@user9403:我为我的答案添加了另一个替代选项。Edit:我仍然得到原始错误,无法将“0.0”从“double”转换为@user9403:您使用的是哪种编译器和版本?我使用的是gcc 5.2.1。当我使用double时,我应该补充一点,就像在您的示例中一样,它会编译,只有当我使用a类而不是基元时,它才不会编译。@user9403:我在我的答案中添加了另一个选项。Auto return,furst return为return{};works?自动返回,第一次返回为返回{};作品