1

好吧,这个标题很糟糕,请随时提出更好的建议,我只是不知道该怎么称呼它。

假设我有一个对象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条件类似的东西?

4

2 回答 2

1
(int a = 1234)

这是一个语句,没有返回值,所以你不能将它与任何东西进行比较。

这就是您在尝试将其与此行上的 1 进行比较时遇到错误的原因:

if ((int a = 1234) > 1)
于 2013-10-17T10:03:19.407 回答
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 将允许使用optionallambda 的进一步模式:

if (auto i = ([](int i) { return i > 1 ? std::optional<int>{i} : std::nullopt; })(1234)) {
    std::cout << *i << '\n';
}

这使用返回是否处于启用状态的operator boolon 。optional

于 2013-10-17T10:05:58.670 回答