有没有C++相当于C#空结合运营商?我做太多空检查,在我的代码。所以是寻找一种方式来减少量的空码。

有帮助吗?

解决方案

有没有办法通过默认在C ++中要做到这一点,但你可以写一个:

在C#??操作者被定义为

a ?? b === (a != null ? a : b)

因此,C ++方法看起来像

Coalesce(a, b) // put your own types in, or make a template
{
    return a != null ? a : b;
}

其他提示

我刚发现这一点:的??操作者又名空合并运算符

  

您也有它在C / C ++如使用?: GNU扩展   操作者:

string pageTitle = getTitle() ?: "Default Title";

使用模板和C ++ 11个lambda表达式。第一个参数(左手侧)只计算一次。第二个参数(右手边),如果第一个是假的(注意只计算了,“如果”和“?”静态投所提供的表达布尔,那指针有“明确的运营商布尔()const的”这是equalivent为 '!= nullptr')

template<typename TValue, typename TSpareEvaluator>
TValue
coalesce(TValue mainValue, TSpareEvaluator evaluateSpare) {

    return mainValue ? mainValue : evaluateSpare();
}

的使用实施例

void * const      nonZeroPtr = reinterpret_cast<void *>(0xF);
void * const otherNonZeroPtr = reinterpret_cast<void *>(0xA);

std::cout << coalesce(nonZeroPtr, [&] () { std::cout << "Never called"; return otherNonZeroPtr; }) << "\n";

将刚刚在控制台打印“0xf”。不必编写的λ为RHS是样板的一点点

[&] () { return <rhs>; }

但它是最好的,如果一个人在语言的语法缺乏支持一个能做到的。

这个怎么样?

#define IFNULL(a,b) ((a) == null ? (b) : (a))

只是想通过要概括的模板,并添加辅助宏扩大@Samuel加西亚的回答削减拉姆达样板:

#include <utility>

namespace coalesce_impl
{
    template<typename LHS, typename RHS>
    auto coalesce(LHS lhs, RHS rhs) ->
        typename std::remove_reference<decltype(lhs())>::type&&
    {
        auto&& initialValue = lhs();
        if (initialValue)
            return std::move(initialValue);
        else
            return std::move(rhs());
    }

    template<typename LHS, typename RHS, typename ...RHSs>
    auto coalesce(LHS lhs, RHS rhs, RHSs ...rhss) ->
        typename std::remove_reference<decltype(lhs())>::type&&
    {
        auto&& initialValue = lhs();
        if (initialValue)
            return std::move(initialValue);
        else
            return std::move(coalesce(rhs, rhss...));
    }
}

#define COALESCE(x) (::coalesce_impl::coalesce([&](){ return ( x ); }))
#define OR_ELSE     ); }, [&](){ return (

使用宏,你可以:

int* f();
int* g();
int* h();

int* x = COALESCE( f() OR_ELSE g() OR_ELSE h() );

我希望这有助于。

有一个GNU海湾合作委员会的扩展,它允许使用 ?: 操作人员中缺少的操作数,请参阅 条件与省略操作数的.

中操作数中的一个条件式可以省略。然后如果 第一个操作数为零,其价值是值的 有条件的表达。

因此,表达式

x ? : y

具有的价值 x 如果这是非零;否则,值 y.

这个例子是完全相当于

x ? x : y

在这个简单的情况下,能够省略中操作数的 是不是特别有用的。当它成为有用的是,当第一个 操作数,或者可能(如果它是一个宏观的论点),包含一侧 效果。然后重复操作数中会执行的 副作用的两倍。省略中操作数的使用价值已经 计算没有所不希望的影响的重新计算。

这种扩展也支持通过 .但是,应该检查与编译器,你们使用和携带的要求用你的代码之前使用的扩展。值得注意的是,MSVC C++编译器,不支持省略中操作数 ?:.

还见相关的计算器的讨论 在这里,.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top