簡體   English   中英

C ++ emplace_back與嵌套對象優化

[英]c++ emplace_back with nested objects optimization

我對emplace_back的行為感到有些困惑。 我們來看一下。

struct innerObject
{
    innerObject(int );
};

class outterObject
{
    innerObject member;
public:
    outterObject(innerObject member);
};

int main()
{
    std::vector<outterObject> v1;
    v1.emplace_back(5);
}

因此,在這種情況下,我們可以傳遞整數並且它可以工作。

如果innerObject需要兩個 int來構造而不是一個,那么構造函數呢? v1.emplace_back(5,5)v1.emplace_back({5,5})或我嘗試過的任何其他組合都v1.emplace_back(5,5) 有可能嗎? 有沒有更好的選擇來制作這樣的東西? (優化)

避免任何類型的復制/移動的唯一方法是,通過提供通用的構造函數,使外部類型選擇加入此類操作:

template <typename A0, typename... Args,
    std::enable_if_t<
        !std::is_same_v<std::decay_t<A0>, outterObject> &&
        std::is_constructible_v<outterObject, A0, Args...>
        , int> = 0>
outterObject(A0&& a0, Args&&... args)
    : member(std::forward<A0>(a0), std::forward<Args>(args)...)
{ }

如果innerObject是可從2個int構造的,則可以編寫v1.emplace_back(10, 20)

如果這看起來過於v1.push_back({{10, 20}})過正,則始終可以執行v1.push_back({{10, 20}}) 請注意,與emplace_back()不同, push_back()不會推斷出其參數類型-只是T const&T&& 這使您可以使用{}

它對一個參數起作用的原因是您的innerObject類的單個int構造函數充當轉換構造函數。 換句話說,outterObject構造函數接受一個innerObject對象,由於轉換構造函數規則,它將單個int參數轉換為一個innerObject。

未使用說明符進行顯式聲明的構造函數,可以使用單個參數 (直到C ++ 11)調用該構造函數,該構造函數稱為轉換構造函數。 鏈接

轉換構造函數僅適用於單參數構造函數。

如果在innerObject構造函數采用單個int之前編寫顯式代碼,則會看到它不會編譯,因為“ explicit”關鍵字不允許int參數自動創建要傳遞給externalObject構造函數的innerObject:

  v1.emplace_back(5); // v1 is a vector of outerObject.

起作用的唯一原因是5參數通過其非顯式構造函數采用int形式轉換為innerObject。 這種轉換構造函數的行為僅適用於單參數構造函數。

如果需要,可以將兩個參數構造函數添加到innerObject中:

innerObject(int x, int y)
    {
        std::cout << "constructor innerObject" << std::endl;
    }

接着:

v1.emplace_back(innerObject(5, 6));

您可以簡單地構造內部對象,而不是emplace_back:

v1.emplace_back(innerObject{10, 20});

另外,您可以為outerObject添加一個構造函數,該構造函數接受兩個參數,然后調用innerObject構造函數。 在這種情況下,您可以這樣稱呼:

v1.emplace_back(10, 20);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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