は、私の知る限り見ることができるように、これを行うための最も現実的な方法は、中括弧を取り除くために、おそらくあり、かつ離散的に引数を取るコンストラクタを追加します。
struct position
{
int x, y;
position(int x, int y) : x(x), y(y) {}
};
class positioned
{
public:
positioned(int x, int y) : pos(x, y) {}
private:
position pos;
};
int main() {
auto bla = std::make_unique<positioned>(1,2);
}
position
が複数のctorのを持っていた場合、あなたはおそらく、いくつかの任意のパラメータを取り、position
のCTOR(複数可)にそれらを通過するpositioned
ための可変長引数テンプレートのctorを作成したいと思います。
struct position
{
int x, y;
position(int x, int y) : x(x), y(y) {}
position(int b) : x(b), y(b) {} // useless--only to demo a different ctor
};
class positioned
{
public:
template <class... Args>
positioned(Args&&... a) : pos(std::forward<Args>(a)...) {}
private:
position pos;
};
int main() {
auto bla = std::make_unique<positioned>(1,2); // use 1st ctor
auto bla2 = std::make_unique<positioned>(1); // use 2nd ctor
}
引数がposition
にpositioned
にmake_unique
から転送されてますこの方法です。これは効率の潜在的なメリットを少なくともいくらか与えます - 一時オブジェクトを作成するために引数を使用するのではなく、元のオブジェクトを初期化するために渡される代わりに、元のオブジェクトを(継承した)オブジェクトのctorに直接基礎となるオブジェクトであるため、その場で一度しか構築しません。
これは、多額の融通性があることに注意してください。
#include <memory>
struct position2
{
int x, y;
position2(int x, int y) : x(x), y(y) {}
};
struct position3 {
int x, y, z;
position3(int x, int y, int z) : x(x), y(y), z(z) {}
};
template <class Pos>
class positioned
{
public:
template <class... Args>
positioned(Args&&... a) : pos(std::forward<Args>(a)...) {}
private:
Pos pos;
};
int main() {
auto bla = std::make_unique<positioned<position2>>(1,2);
auto bla2 = std::make_unique<positioned<position3>>(1, 2, 3);
}
互換性::私はmake_unique
は、その転送/可変引数のctorのを得たときにそれはだから、これは、C++ 14以降が必要と考えている。例えば、のpositioned
は、テンプレート、および基礎となるposition
テンプレート引数そのものだったと仮定しましょう
OKです。削除しましょう。 –