如何保持条件操作的结果?

时间:2013-10-17 09:57:13

标签: c++

好吧标题不好,请随意提出更好的建议,我只是不知道该怎么称呼它。

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

2 个答案:

答案 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来返回它是否处于参与状态。