将3个C ++语句合并为一个

时间:2016-01-18 14:01:40

标签: c++

考虑这个类和函数定义:

class A
{
public:
    A() {}
};

class BIf
{
public:
    virtual ~BIf() {}    
};

class B : public A,
          public BIf
{
public:
    B() {}  
};

void func( A* a )
{

}

现在,考虑一下我需要:

  • 创建新的B对象
  • 将其存储为BIf界面
  • 将其传递给func函数

然后我需要这样做:

int main()
{
    BIf* ptr = NULL;

    ...

    // is there no way to merge this into a single-line instruction?
    B* b = new B();
    ptr = b;
    func( b );

    ...

    delete ptr;
}

我希望将其合并到其中一个"这样很难阅读和理解"单个C ++语句....

显然func( ptr = new B() );无法编译,因为ptr不属于A*类型。 另一种方法是创建辅助函数:

inline A* helper( B* b, BIf*& interf )
{
    interf = b;
    return b;
}

int main()
{
    BIf* ptr = NULL;
    ...
    func( helper( new B(), ptr ) );
    ...
    delete ptr;
}

使用本机C ++行为有更聪明的方法吗?我听说过lambda函数......这有用吗?

注意:这是我的MCVE(在创建基于模板QWidget的类(QLayout::addWidget)时调用funcB)时更相关需要将此存储为非模板类​​(BIf)以供以后使用....但这不是MCVE ....)。

1 个答案:

答案 0 :(得分:1)

如果您真的想在一行中执行此操作,我会编写一个函数来制作B,在其上调用func并将其返回。希望在您的真实代码中,您能够为它提出一个好名字,这可以说是对此类事情最重要的考虑因素

template <typename T>
std::unique_ptr<T> make_and_func () {
    auto ptr = std::make_unique<T>();
    func(ptr.get());
    return ptr;
}

int main()
{
    std::unique_ptr<BIf> ptr = nullptr;
    //...
    ptr = make_and_func<B>();
    //...
}

如果确实想要使用lambda,你可以这样做(未经测试):

int main()
{
    std::unique_ptr<BIf> ptr = nullptr;
    auto make_and_func = [&ptr]() {
        auto p = std::make_unique<B>();
        func(p);
        ptr = std::move(p);
    };
    //...
    make_and_func();
    //...
}

我认为这是一个非常糟糕的主意。局部变量突变隐藏在lambda后面,这可能导致错误和维护问题。我建议使用第一个选项。