gpt4 book ai didi

c++ - 我可以在 C 程序中使用 C++ 模板库吗?

转载 作者:可可西里 更新时间:2023-11-01 16:01:42 26 4
gpt4 key购买 nike

我对 C++ 的了解有限。我知道只要有 C 接口(interface)可用,就可以从 C 调用 C++ 库。是否可以从 C 库调用 .hpp 文件中定义的 C++ 模板库?例如这个精彩的expression evaluation图书馆。

也许是时候学习 C++ 了!好的。这是第一次尝试:

#ifndef EXPRTK_C_H_
#define EXPRTK_C_H_
#include "exprtk.hpp"

//Header
#ifdef __cplusplus
extern "C" {
#endif

typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;

void add_variable_(symbol_table_t st, char* name, double *value);
void register_symbol_table_(expression_t ex, symbol_table_t st);
void compile_(parser_t parser, char *expression_string, expression_t ex);
double evaluate_(expression_t ex);

#ifdef __cplusplus
}
#endif

#endif /* EXPRTK_C_H_ */


#include "exprtk.hpp"
#include "exprtk_c.hpp"

这是.cpp 文件。 trig_function() 是实例,在main() 中使用。接下来是我对函数的包装尝试。错误消息与解析器有关。

exprtk.hpp:16962:7: error: ‘exprtk::parser<T>::parser(const exprtk::parser<T>&) [with T = double]’ is private
exprtk_simple_example_01.cpp:85:83: error: within this context
exprtk_simple_example_01.cpp:60:6: error: initializing argument 1 of ‘void compile_(parser_t, char*, expression_t)’

template<typename T>
void trig_function() {
std::string expression_string =
"clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
T x;
exprtk::symbol_table<T> symbol_table;
symbol_table.add_variable("x", x);
symbol_table.add_constants();

exprtk::expression<T> expression;
expression.register_symbol_table(symbol_table);

exprtk::parser<T> parser;
parser.compile(expression_string, expression);

for (x = T(-5.0); x <= T(+5.0); x += 0.001) {
T y = expression.value();
printf("%19.15f\t%19.15f\n", x, y);
}
}



//Cpp file
void add_variable_(symbol_table_t st, char *varname, double *value) {
const std::string varname_ = varname;
bool r = st.add_variable(varname_, *value);
printf("%d\n", r);
r = st.add_constants();
}

void register_symbol_table_(expression_t ex, symbol_table_t st) {
ex.register_symbol_table(st);
}
void compile_(parser_t parser,char *expression_string, expression_t ex) {
const std::string expression_string_ = expression_string;
parser.compile(expression_string_, ex);
}

double evaluate_(expression_t ex) {
double val = ex.value();
return (val);
}

int main() {
trig_function<double>();

double x;
//exprtk::symbol_table<double> symbol_table;
symbol_table_t symbol_table;
add_variable_(symbol_table, "x", &x);
symbol_table.add_constants();

//exprtk::expression<double> expression;
expression_t expression;
register_symbol_table_(expression, symbol_table);

//exprtk::parser<double> parser;
parser_t parser;
compile_(parser, "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)", expression);

double q = -5.0, y = 0.0;
for (x = q; x <= +5.0; x += 0.001) {
y = evaluate_(expression);
printf("%19.15f\t%19.15f\n", x, y);
}
return (0);
}

最佳答案

一定要学习 C++。

您可以将模板隐藏在一个 cpp 文件中并公开一个接口(interface)来使用它们:

//Header
#ifdef __cplusplus
extern "C" {
#endif
void push(int elt);
int pop();
#ifdef __cplusplus
}
#endif

//Cpp file
static std::deque<int> queue;

void push(int elt) {
queue.push_back(elt);
}

int pop() {
auto tmp = queue.front();
queue.pop_front();
return tmp;
}

您无法通过 C 实例化模板,但您可以使用一个头文件,该文件在幕后利用模板并将所有内容链接在一起。也就是说,我强烈建议过去离开 C,学习 C++;它赋予更多力量、速度和安全性。

关于c++ - 我可以在 C 程序中使用 C++ 模板库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874765/

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