C++ 我如何保持操作结果不受条件限制?

C++ 我如何保持操作结果不受条件限制?,c++,C++,好吧,这个标题不好,请随意提出更好的建议,我只是不知道该怎么称呼它 假设我有一个对象a,我想给它赋值,检查这个值是否满足某个条件,然后在满足条件的情况下做一些事情。以下是一种方法: int a = 1234; if (a > 1) { someFunction(a); } 但是如果我不需要测试之外的a呢?如果我试着做If(int a=1234>1),那么我得到a=1,因为它先解右手边,如果我把定义放在括号里,我得到: if ((int a = 1234) > 1) // abo

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

假设我有一个对象
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);
}
显然,这不是一个交易破坏者,但由于您可以为循环在
中声明对象,我认为可能会实现类似于
if
条件的功能

(int a = 1234)
这是一个语句,没有返回值,因此无法将其与任何内容进行比较

这就是您在尝试将其与此行中的1进行比较时出错的原因:

if ((int a = 1234) > 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';
}
希望C++14之后的TS将允许进一步的模式使用和lambda:

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

std::您不能这样做。您可以声明一个变量,初始化它并检查它的值。对于其他任何事情,它需要在
if
语句之前。这就是为什么您可能会得到左侧必须是var或表达式error似乎是模板BTW的主要候选。您可以在没有lambda的情况下执行此操作。
if(自动b=i>5?std::make_可选(5):std::nullopt)
工作正常fine@PeterTlambda是这样的,您不必重复值
1234
(计算起来可能很昂贵)。
if (auto i = ([](int i) { return i > 1 ? std::optional<int>{i} : std::nullopt; })(1234)) {
    std::cout << *i << '\n';
}