如何将 if 命令的条件语句保存为字符串?
how to save the conditional statement of an if command as a string?
我有一个数值算法。我为 R^2 中的点创建了一组 x 和 y 坐标。然后,我使用一个规则来查看哪些点适合我的目的,一个简单的 if 语句如下:
int N = 0;
for (int i1 = -xN; i1 < xN + 1; i1++)
{
for (int i2 = -yN; i2 < yN + 1; i2++)
{
double x = dist(0) * i1;
double y = dist(1) *i2;
if (sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
{
Points.row(N) = trans(vec{ x, y});
N = N + 1;
}
}
}
由于我在每个示例中更改了规则(即 sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91) ,我想知道是否可以将其存储为字符串变量,然后将其与示例的其他参数一起保存在单个文本文件中。像这样:
ofstream myfile;
myfile.open("resultEXAMPLE2D01.txt");
myfile << "xN = [" << xN << "];" << endl;
myfile << "N = [" << output.N << "];" << endl;
myfile << "% Condition is " << cond << endl;
myfile.close();
在这种情况下,“cond”应该是“sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91”。
所以,在“cond”中,x 和 y 不是变量,我只是把整个事情看成 text/string。但是在 if 语句中我想评估 x 和 y 的一些标准,所以这个“条件”应该是一个函数,有两个双打作为输入和一个 bool 作为输出。
有没有一些直接的方法可以进行这种类型转换?
看来您需要 Stringification
。您可以在这里阅读更多相关信息:
- https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html
- Stringification of a macro value
因此,您可以定义宏并将您的条件传递给它。在宏中,您可以放置您的计算代码,使用传递的条件并将您的条件字符串化(将 #cond
用于 cond
参数)以输出到某个地方(文件,控制台,...)。
示例如下:
int N = 0;
#define Calculate(cond) \
{ \
N = 0; \
for (int i1 = -xN; i1 < xN + 1; i1++) \
{ \
for (int i2 = -yN; i2 < yN + 1; i2++) \
{ \
double x = dist(0) * i1; \
double y = dist(1) *i2; \
\
if (cond) \
{ \
Points.row(N) = trans(vec{x, y}); \
N = N + 1; \
} \
\
} \
} \
\
std::cout << "Condition: " << #cond << std::endl; \
}
int main()
{
Calculate(sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
Calculate(x > 0)
return 0;
}
程序输出:
Condition: sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91
Condition: x > 0
我有一个数值算法。我为 R^2 中的点创建了一组 x 和 y 坐标。然后,我使用一个规则来查看哪些点适合我的目的,一个简单的 if 语句如下:
int N = 0;
for (int i1 = -xN; i1 < xN + 1; i1++)
{
for (int i2 = -yN; i2 < yN + 1; i2++)
{
double x = dist(0) * i1;
double y = dist(1) *i2;
if (sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
{
Points.row(N) = trans(vec{ x, y});
N = N + 1;
}
}
}
由于我在每个示例中更改了规则(即 sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91) ,我想知道是否可以将其存储为字符串变量,然后将其与示例的其他参数一起保存在单个文本文件中。像这样:
ofstream myfile;
myfile.open("resultEXAMPLE2D01.txt");
myfile << "xN = [" << xN << "];" << endl;
myfile << "N = [" << output.N << "];" << endl;
myfile << "% Condition is " << cond << endl;
myfile.close();
在这种情况下,“cond”应该是“sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91”。 所以,在“cond”中,x 和 y 不是变量,我只是把整个事情看成 text/string。但是在 if 语句中我想评估 x 和 y 的一些标准,所以这个“条件”应该是一个函数,有两个双打作为输入和一个 bool 作为输出。 有没有一些直接的方法可以进行这种类型转换?
看来您需要 Stringification
。您可以在这里阅读更多相关信息:
- https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html
- Stringification of a macro value
因此,您可以定义宏并将您的条件传递给它。在宏中,您可以放置您的计算代码,使用传递的条件并将您的条件字符串化(将 #cond
用于 cond
参数)以输出到某个地方(文件,控制台,...)。
示例如下:
int N = 0;
#define Calculate(cond) \
{ \
N = 0; \
for (int i1 = -xN; i1 < xN + 1; i1++) \
{ \
for (int i2 = -yN; i2 < yN + 1; i2++) \
{ \
double x = dist(0) * i1; \
double y = dist(1) *i2; \
\
if (cond) \
{ \
Points.row(N) = trans(vec{x, y}); \
N = N + 1; \
} \
\
} \
} \
\
std::cout << "Condition: " << #cond << std::endl; \
}
int main()
{
Calculate(sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
Calculate(x > 0)
return 0;
}
程序输出:
Condition: sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91
Condition: x > 0