我有一个功能,需要一个" 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的构造函数。
答案 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);
}