C ++ функция, которая возвращает строку, float или int - PullRequest
0 голосов
/ 18 сентября 2018

Так что я слишком упрощаю то, что пытаюсь сделать здесь, но в основном у меня есть функция, которая выглядит следующим образом:

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

    ... 

};

Я хочу, чтобы эта функция могла принимать float,int и string в качестве левого и правого аргументов.Если передаются строки и используется оператор +, строки должны быть объединены, если оператор, который не поддерживает строки, должен выдать ошибку.

Я также хочу, чтобы функция моглавернуть оба float, int и string.

Может быть, это невозможно, если да, пожалуйста, дайте мне совет, как это сделать вместо этого.

...

Я пишу переводчик, если кому-то интересно.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Этого можно добиться с помощью шаблона функции.

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 - и вы хотите, чтобы операция выдавала ошибку, вам нужно специализировать шаблон для этогоtype:

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), но последний не требуется.

0 голосов
/ 18 сентября 2018

Не уверен, почему вопрос ставится под сомнение, потому что это имеет смысл в 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;
   // ...
}
...