簡體   English   中英

沒有unique_ptr的現代C ++構建器模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM