返回字符串,浮点或整型的C ++函数

时间:2018-09-18 06:48:37

标签: c++ g++

所以我在这里简化了我要做的事情,但是基本上我有一个看起来像这样的函数:

int perform_operation(int left, std::string op, int right) {
    if (op == "+")
        return left + right;
    if (op == "-")
        return left - right;

    ... 

};

我希望此函数能够接受floatintstring作为左右参数。 如果传入了字符串,并且使用了+运算符,则应该将这些字符串连接起来;如果不支持字符串的运算符,则应该抛出错误。

我还希望函数能够同时返回floatintstring

也许这是不可能的,如果可以的话,请给我一个有关如何执行此操作的建议。

...

如果有人在想,我正在写翻译。

2 个答案:

答案 0 :(得分:3)

您可以使用功能模板来实现。

template<class T>
T perform_operation(const T& left, std::string_view op, const T& right)
{
    if (op == "+")
        return left + right;
    if (op == "-")
        return left - right;

    // ...
}

现在,由于std::string不支持operator -,并且您希望该操作引发错误,因此您需要对此类型的模板进行专门化处理:

template<>
std::string perform_operation<std::string>(const std::string& left, std::string_view op, const std::string& right)
{
    if (op == "+")
        return left + right;

    throw std::invalid_argument("std::string supports operator + only");
}

可以像下面这样实例化和调用它。

const int result1 = perform_operation(1, "+", 2);
const float result2 = perform_operation(2.f, "-", 3.f);
const std::string result3 = perform_operation<std::string>("hello", "+", " world");

assert(result1 == 3);
assert(std::abs(result2 + 1.0f) < std::numeric_limits<float>::epsilon()));
assert(result3 == "hello world");

请注意,我已经更改了参数类型,以将操作数接受为const限定的引用,将运算符接受为std::string_view(C ++ 17功能),但是不需要后者。

答案 1 :(得分:1)

不确定为什么这个问题被否决,因为这在C ++中是很合理的。

您需要的是template。具体来说,是功能模板。

template <typename T>
T perform_operation(T left, std::string op, T right) {
    if (op == "+")
        return left + right;
    if (op == "-")
        return left - right;
    // ... 
}

当然,模板没有operator-,因此您可以使用重载:

std::string perform_operation(std::string left, std::string op, std::string right) {
    if (op == "+")
        return left + right;
   // ...
}