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