지금까지 내가 볼 수 있듯이,이 작업을 수행 할 수있는 가장 실용적인 방법은 괄호를 제거하고, 몰래 인수를 취할 생성자를 추가 얻을 아마 :
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
에서 통해 전달 받기 방법.이렇게하면 효율면에서 적어도 잠재적 인 이점도 있습니다. 임시 객체를 만드는 데 인수를 사용하는 대신 기본 객체를 초기화하기 위해 전달되는 대신 원본 객체를 참조 객체에 직접 전달합니다 (참조). 기본 객체이므로 한 번만 내부에서 구성합니다.
이것은 우리에게 상당한 융통성을 제공함을 주목하십시오. 예를 들어, positioned
을 가정 해 봅시다 자체가 템플릿이 있었고, 기본 position
템플릿 인수 :
#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 이상이 필요합니다 생각합니다.
확인. 삭제합시다. –