4

템플릿 매개 변수 T가있는 클래스 템플릿 템플릿이 있고 Templ 클래스에는 obj라는 T 유형의 데이터 멤버가 있습니다. C++ 클래스 템플릿의 초기화 프로그램 목록 생성자를 제공합니다.

template <class T> 
class Templ 
{ 
public: 
    template <class... Args> explicit Templ (Args&&... args) 
    : obj (std::forward<Args>(args)...) 
    { 
    } 
private: 
    T obj; 
}; 

가 지금은 그 타입 T는 초기화 목록 생성자를 가진 클래스가 될 수 있습니다 실현, 그리고 나는 그것이 TEMPL를 통해 액세스 할 수 싶어 : 나는 OBJ의 생성자에 인수를 전달하는 가변 인자 생성자 템플릿을 썼다. 그래서 std::list::emplacestd::make_shared을 확인했습니다. 그들은 광산처럼 가변적 인 기능을 가지고 있지만, init-list를 사용하는 오버라이드가 없습니다. 몇 가지 이유.

첫 번째 질문 : 왜? 어떤 클래스 T를 init-list ctor와 함께 사용하면 std::list<T>을 사용하면 어떨까요? 왜 list :: emplace에는 initializer_list를 취하는 버전이 없습니까? 아마 내가해야 할 좋은 이유가있다. 그래서 나는 알고 싶다.

또한 STL의 기능과 관계없이 - init-list ctor를 좋은 디자인으로 제공해야합니까? 내 말은, 그것은 variadic ctor와 똑같지, 그렇지? 사용자가 템플릿 <>과 함께 사용할 모든 유형 또는 클래스 T를 선택하도록 허용하고 T에 정의 된 ctor를 직접 호출 할 수 있습니다. init-list를 사용하는 ctor 인 경우에도 마찬가지입니다.

+0

첫 번째 질문은 좋은 질문이지만 다른 세 가지 질문은 실제로 별도의 게시물이어야합니다. –

+0

@VaughnCato 나는 그 중 하나를 분리했다. 한 번에 20 분 안에 게시 할 수 있기 때문에 나머지는 고칠 수 없습니다. 다음 번에까지 – cfa45ca55111016ee9269f0a52e771

+0

이제 단 하나의 질문입니다. – cfa45ca55111016ee9269f0a52e771

답변

2

initializer_list 생성자를 전달하는 문제는 가장 사소한 인수 형식하지만 모두가 추론 될 수없는 것입니다 (Templates don't always guess initializer list types) : 당신은 대부분의 경우 m{std::initializer_list<...>{...}}를 작성해야 것 때문에

#include <map> 
template<typename T> struct U { 
    T t; 
    template<typename...A> explicit U(A&&...a): t(std::forward<A>(a)...) {} 
    template<typename L, typename = typename std::enable_if< 
     std::is_constructible<T, std::initializer_list<L>>::value>::type> 
     explicit U(std::initializer_list<L> l): t(l) {} 
}; 
U<std::map<int, int>> m{{{0, 1}, {2, 3}}}; // fails, couldn't deduce 'L' 

는 많은 지점이 아니다 프리미티브만을 제공하고 확실히 그렇게 할 표준이 아닙니다.

흥미로운 initializer_list 인수가 컨테이너 유형 일 가능성이 높다고 생각하면 Optionally supporting initializer_list construction for templates maybe wrapping containers에서 취한 접근 방식을 살펴볼 수 있습니다.

+0

컨테이너를 감싸지 않을 것으로 예상되지만, 초기화가있는 클래스를 지원하고 싶습니다. - 목록 ctor. 어떤 경우에는 공제가 효과가 없습니까? 템플릿 매개 변수로 사용되는 클래스가 기본 유형 변수 또는 정의 된 클래스의 객체 목록 (쌍 또는 컨테이너 또는 이와 유사한 객체가 아닌)의 init-list를 사용하는 ctor를 갖는 경우 작동합니다 ? 또한 enable_if를 사용해야합니까? 내가하지 않으면 어떻게 될까? – cfa45ca55111016ee9269f0a52e771

+1

@ fr33domlover 이니셜 라이저가'{x1, x2, ...}'형식 인 경우, 모든'x'는 같은 타입의 prvalue 표현식입니다. 문제는 중괄호가 중첩 된 경우입니다. 'enable_if'는 일정한 초기화를 사용하고자 할 때 필요합니다; 'initializer_list' 생성자는 탐욕 스럽습니다 (13.3.1.7). – ecatmur

+1

우리는 균등하거나 이질적이기 때문에 braced initializer리스트를 완벽하게 전달할 수있는 다음 C++에 대한 initializer_tuple 내장 유형이 필요합니다. –