W predykatach masz odpowiednie porównania (pierwsze funkcje):
#include <iostream>
#include <string>
#include <cstdlib>
#include <functional>
#include <unordered_map>
#include <tuple>
using evaluator_t = std::function<bool(const std::string&, const std::string&)>;
using values_t = std::tuple<const std::string, const std::string, const std::string>;
// Predicates..
bool valuesEqual(const std::string& val1, const std::string& val2) {
return val1 == val2;
}
bool valuesNotEqual(const std::string& val1, const std::string& val2) {
return ! valuesEqual(val1, val2);
}
bool valuesGreather(const std::string& val1, const std::string& val2) {
return (val1.size() > val2.size()) || (val1 > val2);
}
bool valuesLower(const std::string& val1, const std::string& val2) {
return (!valuesGreather(val1, val2)) && valuesNotEqual(val1, val2);
}
bool valuesGreatherEqual(const std::string& val1, const std::string& val2) {
return valuesGreather(val1, val2) || valuesEqual(val1, val2);
}
bool valuesLowerEqual(const std::string& val1, const std::string& val2) {
return valuesLower(val1, val2) || valuesEqual(val1, val2);
}
values_t readValues() {
std::string value1;
std::string value2;
std::string oper;
std::cin >> value1 >> oper >> value2;
return values_t(value1, oper, value2);
}
bool evaluate(values_t& values) {
static const std::unordered_map<std::string, evaluator_t> evaluator_map = {
{"==", valuesEqual}, {"!=", valuesNotEqual},
{">", valuesGreather}, {"<", valuesLower},
{">=", valuesGreatherEqual}, {"<=", valuesLowerEqual}
};
auto itFunction = evaluator_map.find(std::get<1>(values));
if(itFunction == evaluator_map.cend()) {
std::cerr << "Nie przewidziano takiego operatora.\n";
return false;
}
return itFunction->second(std::get<0>(values), std::get<2>(values));
}
int main() {
auto values = readValues();
std::cout << (evaluate(values) ? "PRAWDA" : "FAŁSZ") << '\n';
return EXIT_SUCCESS;
}