Согласно Раздел 20 - Возвращаемые значения выражений из readme . Можно немедленно выйти из выражения, возвращающего любое количество переменных любого типа, просто используя оператор возврата.
В документации представлен следующий пример:
std::string expression_string =
" if (x < y) "
" return [x + 1,'return-call 1']; "
" else if (x > y) "
" return [y / 2, y + 1, 'return-call 2']; "
" else if (equal(x,y)) "
" x + y; "
" return [x, y, x + y, x - y, 'return-call 3'] ";
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
symbol_table_t symbol_table;
expression_t expression;
parser_t parser;
double x = 0;
double y = 0;
symbol_table.add_variable("x",x);
symbol_table.add_variable("y",y);
expression.register_symbol_table(symbol_table);
parser.compile(expression_string,expression);
T result = expression.value();
if (expression.results().count())
{
typedef exprtk::results_context<T> results_context_t;
typedef typename results_context_t::type_store_t type_t;
typedef typename type_t::scalar_view scalar_t;
typedef typename type_t::vector_view vector_t;
typedef typename type_t::string_view string_t;
const results_context_t& results = expression.results();
for (std::size_t i = 0; i < results.count(); ++i)
{
type_t t = results[i];
switch (t.type)
{
case type_t::e_scalar : ...
break;
case type_t::e_vector : ...
break;
case type_t::e_string : ...
break;
default : continue;
}
}
Примечание1: Ваше выражение станет:
var z[2] := { x, y }; return [z];
Note2: Чтобы иметь свой «однострочный» метод, вы можете написать простую бесплатную функцию , которая обертывает код стандартной пластины после условного выражения и извлекает вектор на ваш выбор (i-й результат, учитывая его векторный тип) из списка results
.
template <typename T>
bool get_vector(const std::size_t index,
const results_context_t& results,
std::vector<T>& v)
{
...
}