好吧标题不好,请随意提出更好的建议,我只是不知道该怎么称呼它。
假设我有一个对象a
,我想为它分配一些值,检查这个值是否符合某些条件,然后在满足条件时执行。这是一种方法:
int a = 1234;
if (a > 1)
{
someFunction(a);
}
但如果我不在此测试之外需要a
怎么办?如果我尝试if(int a = 1234 > 1)
,那么我会得到a = 1
,因为它首先解决了右边的问题,如果我将定义放在括号中,我会得到这个:
if ((int a = 1234) > 1) // about 3 different errors
{
someFunction(a);
}
显然这不是一个交易破坏者,但是因为你可以在for
循环中声明对象,我认为有可能在if
条件下实现类似的东西吗?
答案 0 :(得分:1)
(int a = 1234)
这是声明并且没有返回值,因此您无法将其与任何内容进行比较。
这是您在尝试将此比较为1时遇到错误的原因:
if ((int a = 1234) > 1)
答案 1 :(得分:1)
我之前使用包含值和比较结果的自定义类型完成了此操作:
struct int_comparison {
int value;
bool comparison;
int_comparison(int value): value(value), comparison() {}
int_comparison &operator>(int rhs) {
comparison = value > rhs;
return *this;
}
explicit operator bool() const { return comparison; }
};
if (auto i = int_comparison(1234) > 1) {
std::cout << i.value << '\n';
}
这通常很难遵循;通常更好地使用嵌套范围:
{
int i = 1234;
if (i > 1) {
...
}
}
希望C ++ 14之后的TS允许使用optional
和lambda进一步模式:
if (auto i = ([](int i) { return i > 1 ? std::optional<int>{i} : std::nullopt; })(1234)) {
std::cout << *i << '\n';
}
这会使用operator bool
optional
来返回它是否处于参与状态。