明确返回模板参数

时间:2016-01-02 17:06:08

标签: c++ c++14

我有一个功能,需要一个" auto"并返回" auto"。此函数采用数字类型(例如,complex,int或double)。但是,根据函数的结果,我需要明确地返回一些东西。例如,如果将复数传递给函数,我需要返回"复数(0,0)"如果"真实"部分数字小于零。代码如下所示:

if(myNumber<0){ return 0.0;} else{ return myNumber; }

当然,我必须超过&#34;少于&#34;运算符,但困难的部分是当myNumber不是double时如何允许返回0。我已经超载了&#34; =&#34;运算符允许将双精度分配给复数,但是我仍然会编译错误。

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

编辑:

我的完整代码如下所示。

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)));  
}}

再次编辑:

事实证明,我没有让我的班级有一个带有双倍的构造函数。当我同时拥有运算符&#34; =&#34;重载和一个具有单个double的构造函数。

2 个答案:

答案 0 :(得分:3)

我看到两种方式:

首先尝试初始化列表:

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

其次是使用type_traits标题中的std::result_of

if(myNumber<0){
    return std::result_of<YourFunctionReference>::type();
}else{
    return myNumber;
}

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

答案 1 :(得分:2)

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

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

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))); 
}

然后您可以使用辅助函数使您的返回类型显式:

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 BSCall(
        const auto &S0,
        const auto &k,
        const auto &discount,
        const auto &sigma
        )
{
    return (sigma<=0) ? 0 : BSCallHelper(S0,k,discount,sigma);
}