2013-12-04 5 views
0

Так что я хочу сделать функцию с параметром, который является conditon, поэтому я могу вызвать функцию с различными условиями, например.Как создать условие со строкой?

int input(string condition){ 
    int number; 
    cin>>number; 
    if (!condition){ 
     cout<<"Wooah maaan, thx!" 
    } else { 
     cout<<"You can do better!" 
    return number; 
} 


void something(){ 
    int g_num; 
    cout<<"Give me a number between 1 and 6"; 
    g_num=input("number<6&&number>1"); 
} 

Как это возможно, потому что с подобным я получаю ан ошибке:

cannot convert 'std::string' to 'bool' in assignmen

Есть идеи?

(я только начал изучать C++, поэтому, пожалуйста, не судите меня, я знаю, что я хромой.)

+0

Используйте 'bool' для условий. – 0x499602D2

+0

Что вы имеете в виду? – godzsa

+0

То, что вы пытаетесь сделать, невозможно на скомпилированном языке. "number <6&&number> 1" - это просто строка, она не имеет никакого значения, кроме этого. Вам придется самому разобрать. –

ответ

0

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

Что вы можете сделать, это сохранить номер и оценить состояние

int input(bool condition){ 

    if (!condition){ 
     cout<<"Wooah maaan, thx!" 
    } else { 
     cout<<"You can do better!" 
    return number; 
} 

void something(){ 
    int g_num; 
    cout<<"Give me a number between 1 and 6"; 
    int number; 
    cin>>number; 
    g_num=input(number<6 && number>"); 
} 

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

0

Условия не могут быть в форме строки. Просто выполните это:

int input() 
{ 
    int number; 
    cin >> number; 

    if ((number > 1) && (number < 6)) { 
     cout << "Wooah maaan, thx!" 
    } else { 
     cout << "You can do better!" 

    return number; 
} 
2

Это возможно, но это нетривиальная задача, и вы, вероятно, захотите избежать, если сможете.

Если вы решите пойти вперёд, вам нужно будет определить грамматику выражений, которые вы хотите поддержать, написать парсер для этой грамматики, а затем оценить выражения. Вы можете рассмотреть что-то вроде Boost Spirit или byacc для анализатора. У вас есть учебники и демонстрации, которые дают хотя бы некоторое представление о том, как определить грамматику.

0

Это не так, как работает, строковый литерал не может быть магическим образом превращен в исполняемый код.

Одним из способов достижения того, что вы хотите, будет шаблон функции, который принимает некоторый вызываемый объект, который вы можете использовать в качестве предиката. Пример:

template<typename Function> 
int input(Function f)   // the type of f is deduced from the call to this 
{        // function 
    int number; 
    if (!(cin >> number)) return -1; // input validation! 
    if (f(number)) 
     cout << "thanks!"; 
    else 
     cout << "meh..."; 
    return number; 
} 

Вы можете использовать это по-разному - передать ему указатель на функцию, объект типа, который перегружает оператор вызова функции (operator()) или лямбда-функции. Есть ограничения на объект, который вы передадите в качестве аргумента, - он должен быть вызван с одним аргументом типа int, и ему нужно вернуть некоторый тип, который можно конвертировать в bool.

Пример:

int g_num = input([](int i){ return i > 1 && i < 6; }); // pass a lambda 
0

Вы можете использовать лямбда-выражения вместо строк. Например,

#include <functional> 

int input(std::function<bool(int x)> f) 
{ 
    int number; 
    cin>>number; 

    if (! f(number)) 
    { 
     cout<<"Wooah maaan, thx!" 
    } 
    else 
    { 
     cout<<"You can do better!" 
    } 

    return number; 
} 

input([](int) { return ((std::cout << "The first\n"), true); }); 
input([] (int){ return ((std::cout << "The second\n"), false); }); 
Смежные вопросы