C ++ 17 표준은 "템플릿 추론 가이드"를 도입합니다. 이 표준 버전에 도입 된 생성자에 대한 새로운 템플릿 인수 추론과 관련이 있다고 생각하지만, 그것이 무엇인지, 무엇을위한 것인지에 대한 간단한 FAQ 스타일의 설명은 아직 보지 못했습니다.
C ++ 17의 템플릿 추론 가이드 란 무엇입니까?
왜 (그리고 언제) 그것들이 필요합니까?
어떻게 신고합니까?
C ++ 17 표준은 "템플릿 추론 가이드"를 도입합니다. 이 표준 버전에 도입 된 생성자에 대한 새로운 템플릿 인수 추론과 관련이 있다고 생각하지만, 그것이 무엇인지, 무엇을위한 것인지에 대한 간단한 FAQ 스타일의 설명은 아직 보지 못했습니다.
C ++ 17의 템플릿 추론 가이드 란 무엇입니까?
왜 (그리고 언제) 그것들이 필요합니까?
어떻게 신고합니까?
답변:
템플릿 추론 가이드는 컴파일러에게 생성자 인수 집합 (및 해당 유형)을 클래스의 템플릿 매개 변수로 변환하는 방법을 알려주는 템플릿 클래스와 관련된 패턴입니다.
가장 간단한 예는 of std::vector
및 반복기 쌍을 취하는 생성자입니다.
template<typename Iterator>
void func(Iterator first, Iterator last)
{
vector v(first, last);
}
컴파일러는 vector<T>
의 T
유형이 무엇인지 파악해야 합니다. 우리는 답이 무엇인지 압니다. T
이어야합니다 typename std::iterator_traits<Iterator>::value_type
. 그러나 입력 하지 않고 컴파일러에게 어떻게 알릴 vector<typename std::iterator_traits<Iterator>::value_type>
까요?
공제 가이드를 사용합니다.
template<typename Iterator> vector(Iterator b, Iterator e) ->
vector<typename std::iterator_traits<Iterator>::value_type>;
이는 컴파일러에게 vector
해당 패턴과 일치 하는 생성자 를 호출 할 때 vector
의 오른쪽에있는 코드를 사용하여 특수화를 추론 한다는 것을 알려줍니다 ->
.
인수에서 유형을 추론하는 것이 해당 인수 중 하나의 유형을 기반으로하지 않는 경우 가이드가 필요합니다. 에서를 초기화 vector
하면 initializer_list
명시 적으로 vector
's가 사용 T
되므로 가이드가 필요하지 않습니다.
왼쪽은 반드시 실제 생성자를 지정하지 않습니다. 작동 방식은 형식에 대해 템플릿 생성자 추론을 사용하는 경우 모든 추론 가이드에 대해 전달하는 인수와 일치한다는 것입니다 (기본 템플릿의 실제 생성자는 암시 적 가이드를 제공함). 일치하는 항목이 있으면이를 사용하여 유형에 제공 할 템플릿 인수를 결정합니다.
그러나 일단 추론이 완료되면 컴파일러가 유형에 대한 템플릿 매개 변수를 파악하면 해당 유형의 객체에 대한 초기화는 아무 일도 발생하지 않은 것처럼 진행됩니다. 즉, 선택한 추론 가이드가 선택한 생성자 와 일치하지 않아도됩니다 .
이는 또한 집계 및 집계 초기화와 함께 가이드를 사용할 수 있음을 의미합니다.
template<typename T>
struct Thingy
{
T t;
};
Thingy(const char *) -> Thingy<std::string>;
Thingy thing{"A String"}; //thing.t is a `std::string`.
따라서 추론 가이드는 초기화되는 유형을 파악하는 데만 사용됩니다. 초기화의 실제 프로세스는 일단 결정이 이루어지면 이전과 똑같이 작동합니다.
vector v{first, last};
옳은 일을하지 않을 것
std::string{32,'*'}[0] == ' '
(ASCII의 경우). 그러나 이것은 C ++ 11 이후로 모두 사실이었습니다.