[英]Modern C++ builder pattern without unique_ptr
我想在現代C ++中實現構建器模式。 來自Java背景,這是我想要模仿的東西:
// Usage
FooBuilder builder;
builder.setArg1(a);
builder.setArg2(b);
Foo foo = builder.build();
// Implementation
public class FooBuilder {
// ...
public Foo build() {
return new Foo(a, b);
}
}
典型的舊教科書只是建議一個人在C ++中這樣做:
class FooBuilder {
// ...
Foo* build() {
return new Foo(m_a, m_b);
}
}
這顯然不是一個好主意,因為處理原始指針可能容易出錯。 到目前為止我提出的最好的方法是手動使用std::unique_ptr
:
class FooBuilder {
// ...
std::unique_ptr<Foo> build() {
return std::make_unique<Foo>(m_a, m_b);
}
}
// Usage
auto fooPtr = builder.build();
Foo& foo = *fooPtr;
foo.someMethod();
它更好,因為它不需要手動delete
,這個雙線程轉換為引用是丑陋的,更重要的是,它使用堆分配,而簡單的無構建器版本只需一個簡單的堆棧分配即可完全正常:
Foo foo(..., ...); // <= on stack
有沒有更好的方法來做到這一點,即沒有unique_ptr,或者為Foo進行某種堆棧分配?
沒有理由必須在堆上分配以使用構建器模式。 只需讓你的build()
方法直接返回Foo
:
class FooBuilder {
public:
Foo build() { // You may consider having a &&-qualified overload
return Foo{ ..., ... };
}
};
通常,如果Foo是copy_constructible ,那么您可以按值返回Foo。
#include <type_traits>
class Foo
{
int i;
public:
Foo(int i): i(i){}
};
static_assert(std::is_copy_constructible<Foo>::value, "Foo is copy-constructible");
struct FooFactory
{
//...
Foo build() {return Foo(1);}
};
int main()
{
FooFactory factory;
//...
Foo foo = factory.build();
}
c ++ 17中的新功能是保證復制省略 ,這意味着即使類型沒有復制或移動構造函數,您也可以按值返回:
#include <type_traits>
class Foo
{
int i;
public:
Foo(int i): i(i){}
// regular copy constructors don't exist for whatever reason.
Foo() = delete;
Foo(Foo const& ) =delete;
Foo(Foo&& ) = delete;
Foo& operator=(Foo const&) = delete;
Foo& operator=(Foo&& ) = delete;
};
static_assert(not std::is_copy_constructible<Foo>::value, "Foo is definitely not copy-constructible");
struct FooFactory
{
//...
Foo build() {return Foo(1);}
};
int main()
{
FooFactory factory;
//...
Foo foo = factory.build();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.