emplace_backの動作について少し混乱しました。みてみましょう。
struct innerObject
{
innerObject(int );
};
class outterObject
{
innerObject member;
public:
outterObject(innerObject member);
};
int main()
{
std::vector<outterObject> v1;
v1.emplace_back(5);
}
したがって、この場合、整数を渡すことができ、それは機能します。
1つだけではなく2つを構築するinnerObject
必要がある場合、コンストラクターはどうですか?私が試した他の組み合わせも機能しません。どういうわけか可能ですか?そのようなものを作るためのより良いオプションはありますか?(最適化) int
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)...)
{ }
これにより、2秒から構築v1.emplace_back(10, 20)
可能である場合innerObject
に書き込むことができますint
。
それがやり過ぎのように思われる場合は、いつでも行うことができますv1.push_back({{10, 20}})
。とpush_back()
は異なりemplace_back()
、引数の型を推測しないことに注意してください。これは、T const&
またはT&&
です。これにより、を使用できます{}
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加