考虑这个类和函数定义:
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
)时调用func
(B
)时更相关需要将此存储为非模板类(BIf
)以供以后使用....但这不是MCVE ....)。
答案 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后面,这可能导致错误和维护问题。我建议使用第一个选项。