C ++ - хранение оператора в виде символа - PullRequest
0 голосов
/ 25 марта 2012

странно, я знаю, но можно ли как-то достичь следующего?

int main (int argc, char * const argv[]) 
{
    const char* op1="+";
    int i = 10;
    int j = 20;
    int k = i op1 j; //compiler error, expected , or ; before op1

    printf("k is: %i", k);
}

Ответы [ 2 ]

6 голосов
/ 25 марта 2012

Конечно, это легко ...

template <class T>
T execute_operator(T a, string op, T b)
{
    static unordered_map<string, function<T(T,T)>> operators =
    {
        { "+", [](T a, T b) { return a + b; } },
        { "-", [](T a, T b) { return a - b; } },
        etc
    };

    return operators[op](a,b);
};

int main (int argc, char * const argv[]) 
{
    const char* op1="+";
    int i = 10;
    int j = 20;
    int k = execute_operator(i,op1,j);

    printf("k is: %i", k);
}
4 голосов
/ 25 марта 2012

Не так.

Вам нужен какой-то способ синтаксического анализа этой строки, а затем переключения на соответствующий код в зависимости от результата.

Вы также можете написать несколько функций:

int add(int x, int y) { return x+y; }
int sub(int x, int y) { return x-y; }
// etc.

и typedef:

typedef int (*func)(int,int);

, а затем создайте std::map<std::string,func>, что сделает процесс поиска и вызова соответствующей функции очень простым.

...