gpt4 book ai didi

c++ - 从 exprTk 获取 vector 作为输出

转载 作者:行者123 更新时间:2023-12-01 14:47:46 27 4
gpt4 key购买 nike

我似乎无法从 exprTk 获得 vector 输出。我认为它应该相对简单,但在手册中我只能找到如何输入一个 vector ,而不是如何输出一个 vector 。

我目前拥有的是:

typedef double T; // numeric type (float, double, mpfr etc...)
typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;

std::string expression_string = "var z[2] := { x, y };";

T x = T(5.3);
T y = T(2.3);
std::vector<T> z;

symbol_table_t symbol_table;
symbol_table.add_variable("x", x);
symbol_table.add_variable("y", y);
symbol_table.add_vector("z", z);

expression_t expression;
expression.register_symbol_table(symbol_table);

//Check if expression is valid
parser_t parser;
if (!parser.compile(expression_string, expression))
{
printf("Compilation error...\n");
return;
}

T result = expression.value();
std::cout << result << std::endl; \\returns: 5.3 as expected the first element of vector z.
std::cout << z[0] << std::endl; \\Crashes the program

我想要的输出只是 vector z。我该怎么做,或者我做错了什么?

最佳答案

根据 自述文件第 20 节 - 表达式返回值,可以立即退出返回任意数量任意类型变量的表达式只需使用 return 语句即可。

文档中提供的例子如下:

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];

注2:为了使用您的“单行”方法,您可以编写一个简单的自由函数,在条件语句之后包装样板代码并提取您选择的 vector (我给出的结果它是 vector 类型) 来自 results 列表。

template <typename T>
bool get_vector(const std::size_t index,
const results_context_t& results,
std::vector<T>& v)
{
...
}

关于c++ - 从 exprTk 获取 vector 作为输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62025485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com