次のように定義された構造体があります。
struct A : public B, public C
{
A(const B& b) : B(b), C()
{}
template<typename... Args>
A(Args&&... args) : B(), C(std::forward<Args>(args)...)
{}
};
int main()
{
B b;
A sample1(b);
A sample2(3); // For example, B has a B(int) constructor.
}
そして、これはうまくいきA(b)
ませB
んB(A&)
.
move
さらに、 B のコンストラクターを追加したい:
struct A : public B, public C
{
A(const B& b) : B(b), C()
{}
A(B&& b) : B(std::move(b)), C()
{}
template<typename... Args>
A(Args&&... args) : B(), C(std::forward<Args>(args)...)
{}
};
最後のステップは、最初の 2 つのコンストラクターを融合することです。
struct A : public B, public C
{
template<typename fw_B>
A(fw_B&& b) : B(std::forward<fw_B>(b)), C()
{}
template<typename... Args>
A(Args&&... args) : B(), C(std::forward<Args>(args)...)
{}
};
質問: 最初のバージョンが衝突を引き起こした場合、最後のバージョン (私の最終的な目的) も機能しないことは明らかです。どうすればこの目標を達成できますか?