Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++ - Fatal编程技术网

C++ C++;简化代码

C++ C++;简化代码,c++,C++,我只是有一个基本问题。这有可能进一步简化吗,因为我把这件事称为“sincos tan asin acos”和“atan”。它看起来很难看,如果可能的话,我想让它看起来很漂亮 if(m_RHS->get_gType() == INT) { ostringstream ss; ss << (sin(m_RHS->evalint() * (M_PI / 180))); return ss.str(); } else

我只是有一个基本问题。这有可能进一步简化吗,因为我把这件事称为“sincos tan asin acos”和“atan”。它看起来很难看,如果可能的话,我想让它看起来很漂亮

if(m_RHS->get_gType() == INT)
    {
        ostringstream ss;
        ss << (sin(m_RHS->evalint() * (M_PI / 180)));
        return ss.str();
    }
else
    {
        ostringstream ss;
        ss << (sin(m_RHS->evaldouble() * (M_PI / 180)));
        return ss.str();
    }
if(m_RHS->get_gType()==INT)
{
ostringstream ss;
ss evalint()*(M_PI/180));
返回ss.str();
}
其他的
{
ostringstream ss;
ss evaldouble()*(M_PI/180));
返回ss.str();
}
是,请尝试以下操作:

ostringstream ss;
double val;

if (m_RHS->get_gType() == INT){
    val = m_RHS->evalint();
} else {
    val = m_RHS->evaldouble();
}

ss << sin(val * (M_PI / 180));
return ss.str();
是的,试试这个:

ostringstream ss;
double val;

if (m_RHS->get_gType() == INT){
    val = m_RHS->evalint();
} else {
    val = m_RHS->evaldouble();
}

ss << sin(val * (M_PI / 180));
return ss.str();
ostringstreamss;
如果(m_RHS->get_gType()==INT)
ss evalint()*(M_PI/180));
其他的
ss evaldouble()*(M_PI/180));
返回ss.str();
这是最简单的

ostringstream ss;
如果(m_RHS->get_gType()==INT)
ss evalint()*(M_PI/180));
其他的
ss evaldouble()*(M_PI/180));
返回ss.str();

这是最简单的元编程,例如:

template<typename T>
std::string sin_deg_str(T angle_deg)
{
    ostringstream ss;
    ss << (sin(angle_deg * (M_PI / 180)));
    return ss.str();
}

// ...

if(m_RHS->get_gType() == INT)
    return sin_deg_str(m_RHS->evalint());
else
    return sin_deg_str(m_RHS->evaldouble());

元编程,例如:

template<typename T>
std::string sin_deg_str(T angle_deg)
{
    ostringstream ss;
    ss << (sin(angle_deg * (M_PI / 180)));
    return ss.str();
}

// ...

if(m_RHS->get_gType() == INT)
    return sin_deg_str(m_RHS->evalint());
else
    return sin_deg_str(m_RHS->evaldouble());


我知道这是如何缩短的,但是如果我想添加cos、tan、asin、acos、atan,我认为这个实现不起作用。我可能大错特错了。在这种情况下,你能举一个使用cos、tan等的(目前很难看的)实现的例子吗。?您可能可以使用函数指针来简化它()对于注释来说有点长,所以我把它放在这里。您的案例块缺少
break语句。按照您概述的“转换为<代码>双重
”策略,简化的方法是将代码分为两个阶段。首先,将值转换为
双精度
。第二,调用适当的trig函数。我知道它是如何缩短的,但是如果我想添加cos、tan、asin、acos、atan,我认为这个实现不起作用。我可能大错特错了。在这种情况下,你能举一个使用cos、tan等的(目前很难看的)实现的例子吗。?您可能可以使用函数指针来简化它()对于注释来说有点长,所以我把它放在这里。您的案例块缺少
break语句。按照您概述的“转换为<代码>双重
”策略,简化的方法是将代码分为两个阶段。首先,将值转换为
双精度
。第二,调用适当的trig函数。哦,这看起来很有趣。我可以试一试。我试过这种方法,但我犯了一些错误。我以前从未使用过模板函数,所以这是一个学习曲线。在.h文件中声明的模板只是我读过的。是吗?是的,它只是在.h文件中。我似乎有一个问题,它无法识别.cpp文件中的模板函数。我不知道你在说什么。你能说得更具体一点吗?哦,这看起来很有趣。我可以试一试。我试过这种方法,但我犯了一些错误。我以前从未使用过模板函数,所以这是一个学习曲线。在.h文件中声明的模板只是我读过的。是吗?是的,它只是在.h文件中。我似乎有一个问题,它无法识别.cpp文件中的模板函数。我不知道你在说什么。你能说得更具体些吗?
template<typename T, typename Function>
std::string call_deg_str(T angle_deg)
{
    ostringstream ss;
    ss << (Function(angle_deg * (M_PI / 180)));
    return ss.str();
}

// ...

if(m_RHS->get_gType() == INT)
    return call_deg_str<sin>(m_RHS->evalint());
else
    return call_deg_str<sin>(m_RHS->evaldouble());