我刚才有一个基本问题。这是否有可能进一步简化,因为我将这同样的事情称为同样的事情,因为它在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();
}
答案 0 :(得分:2)
元编程,'shizzle:
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());
不确定是否可以使用if...then
运算符消除?:
,因为类型不匹配。
添加更多功能?这可能有效:
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());
答案 1 :(得分:1)
是的,试试这个:
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();
请注意,我使用double
作为val的类型,因为您可以将整数存储在double中,但不能相反(不截断)。
或者紧凑性(但牺牲可读性):
ostringstream ss;
ss << sin((m_RHS->get_gType() == INT ? m_RHS->evalint() : m_RHS->evaldouble()) * (M_PI / 180));
return ss.str();
答案 2 :(得分:1)
ostringstream ss;
if(m_RHS->get_gType() == INT)
ss << (sin(m_RHS->evalint() * (M_PI / 180)));
else
ss << (sin(m_RHS->evaldouble() * (M_PI / 180)));
return ss.str();
这是最狡猾的