C ++简化代码

时间:2014-03-22 04:46:23

标签: c++

我刚才有一个基本问题。这是否有可能进一步简化,因为我将这同样的事情称为同样的事情,因为它在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();
    }

3 个答案:

答案 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();

这是最狡猾的