C ++에서 SFINAE와 메타 프로그래밍은 의도적이거나 템플릿의 부산물입니까?


11

SFINAEtemplate메타 프로그래밍은 훌륭한 작업을 수행 할 수 있으며 많은 라이브러리에서도이를 사용합니다.

역사적으로이 두 "마법의 개념"은 C ++에서 의도적으로 소개 / 지원 되었습니까? 또는 나중에 원래 template프로그래밍 의 유용한 부산물 (부산물)로 발견되었습니다 .

답변:


19

약 10 년 전에 회의 일이 끝나고 Erwin Unruh 와 몇 명의 다른 사람들과 함께 술집에서 자신을 발견했으며 VJovic이 언급 한 프로그램에 대해 그에게 물었습니다 . 우리는 그때까지 두 잔의 맥주를 가지고 있었고, 비공식 회의였으며 10 년 동안 내 머리에 살았으므로 소금 한 알을 곁들여서 가져 가십시오. 그러나 내 기억에 따르면 :

그는 STL을보다 효과적으로 제공하기 위해 템플릿 기능을 추가했다고 말했다. 그에 따르면,위원회의 일부 / 많은 사람들이 자신의 능력을 완전히 몰라도 무언가를 창조하고 있다고 느꼈습니다. 그는 모든 템플릿, 특히 부분적인 전문화가 Turing-complete 언어를 구성했다고 의심했으며, 항상 공식적인 증거를 만들려고했지만 결코 그렇게하지는 않았습니다.

대신 어느 날 밤 표준화 회의에서 그는 소수를 컴파일하는 동안 계산 된 오류 메시지 (현대 컴파일러와 함께 작동해야하는 버전이 여기에 있음 ) 로 인쇄 하는 프로그램을 만들었 습니다 . 템플릿 메타 프로그램으로서 오늘날의 표준에서는 그다지 인상적이지는 않지만 결국 첫 번째였습니다. 누군가가 공식적으로 프로그램을 제출하여 농담으로 간주 한 것을 공식 ISO 표준화 문서로 만들었습니다.

나는 그에게 프로그램에 대한 Bjarne Stroustrup의 반응에 대해 구체적으로 물었고 Erwin은 그의 손으로 그의 눈을 가리면서 그를 흉내 냈습니다. :)

나는이 회의에 참석 한 Todd Veldhuizen 에게 표현 템플릿을 어떻게 만들 었는지 물었다 . (그는 확실히 이야기하기에 좋은 녀석이었다.) 그러나 나는 훨씬 더 어 렸고, 평생 기회가 사라지게했다.:(


+1, 재미있는 경험. 그들은 SFINAE에 대해 이야기 했습니까?
iammilind

@iammilind : SFINAE는 STL을 더 잘 지원하기 위해 추가 된 기능 중 하나 일 뿐이라고 생각합니다. "SFINAE"라는 이름은 그 이후 몇 년 만에 만들어졌습니다.
sbi

11

1994 년 C ++ 표준화위원회 회의에서 E. Unruh는 템플릿을 사용하여 컴파일 타임에 무언가를 계산할 수 있음을 발견했습니다. 그는 소수를 인쇄하는 프로그램을 작성했습니다. 이 연습에서 흥미로운 부분은 소수가 생산 과정이 아닌 컴파일 과정에서 컴파일러에 의해 수행되었다는 것입니다. 이 프로그램은 완전히 이식 가능하지는 않았지만 템플릿 인스턴스화 메커니즘은 컴파일 타임에 사소한 계산을 수행 할 수있는 원시 재귀 언어라는 것을 보여주었습니다.

이 발췌는 Vandevoorde와 Josuttis (17 장)의 "c ++ 템플릿"에서 발췌 한 것입니다.

보시다시피, 그것은 일찍 발견되었고 그 힘은 즉시 인식되었습니다.


2
좋아요 내가 인터넷에서 읽은 이런 종류의 기사는 출처를 기억하지 못한다. SFINAE에서도 마찬가지입니까?
iammilind

@iammilind "SFINAE도 마찬가지입니까?"는 무슨 뜻입니까?
BЈовић

1
SFINAE는 일반적으로 컴파일러의 지원이 필요합니다. 우연히 발견되지 않았을 가능성이 있습니다.
iammilind

: @iammilind 나는이 책에서 유사한 텍스트가있는 InformIT에 기사 발견 informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind 답변을 수정했습니다. 템플릿에 대한 컴파일러 지원이 제한되어 있기 때문에 우연히라고 말할 수 있습니다. 이 프로그램은 이식성이 없었으며 하나의 컴파일러에서만 작동한다고 생각합니다.
BЈовић
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.