Lyn
조회 수 30718 추천 수 0 댓글 0
Atachment
첨부 '2'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

아래 코드는 최신의 Visual C++ 2013 에서 작성 되었습니다.


요즘 하는거 없이 바빠서 (...) 신기능 정리하는 사이에 2013이 정식 출시되어 버렷네요.

C++11이 나오면서 추가된 기능 중 하나가 가변인자 템플릿인데, 이번엔 가변인자 템플릿 함수를 한번 구경해 보겠습니다.
tmp.jpg

혹시 C++ Template Metaprogramming 라는 희대의 마도서를 보신 분들이나,  순수 함수형 언어를 경험하신 분들이라면 이해가 쉬울텐데요, 가변인자 템플릿 함수는 기존 템플릿 메티프로그래밍(이하 TMP)과 매우 유사합니다.


결정적인 공통점은 루프가 아니라 재귀로서 반복한다는 점이겠네요.
즉 하나의 함수에서 여러개의 인자를 처리하는게 아니라 가변인자 인자 N개 함수가 N-1개의 함수를 호출하고, 또 거기서 N-2개의 함수를 호출하고... 반복하다가  최종적으로 가변인자가 0개인 함수를 호출 하면서 가변인자 함수 호출이 완료되게 됩니다.


여기 까지 읽으셧으면 눈치 채셧을텐데.. 네 맞습니다. 가변인자 함수와 가변인자가 아닌 함수 2개가 필요하게 됩니다.

잠깐 예지를 보면

#include <string>
#include <iostream>

using namespace std;

template<typename T>
void LogWrite(T value)
{
	cout << value << endl;
	return;
}
template<typename T, typename... Args>
void LogWrite(T value, Args... args) 
{	
	cout << value << ' ';
	LogWrite(args...);
}

void wmain()
{
	LogWrite<int, int, double>(123, 456, 789.012);
	LogWrite(123, 456, 789.012);
}

이런 형식이 됩니다. Args라는 식별자를 가변템플릿 인자 목록으로 쓰고 있는데 이는 가변인자함수와 비슷 합니다.
... 이 들어가는것도 그렇구요, 가변인자 함수와 마찬가지로 모든 인자가 가변일수는 없습니다. 반드시 1개 이상의 고정 인수를 가져야 합니다(단 템플릿이므로 type이 고정되진 않지만요)

여기서 저 ... 는 Parameter Pack 이라고 부른다고 합니다.



네 참 심플한데... C++ 문법 만드는 사람들이 여기서 끝낼정도로 단순할리가 없습니다(....) 
여기에 붙을 수 있는 각종 추가 기능들이 있는데 그중 하나가 가변인자의 갯수를 세는 sizeof... 연산자 입니다.

다시한번 말하지만 sizeof... 입니다 ... 까지 붙어야 정확한 이름입니다.


그리고 이 sizeof... 연산자는 가변인자템플릿 내부에서만 사용 가능합니다. 다른곳에서 사용하려고 하면 0이 나오는것이 아닌 컴파일 오류가 발생합니다.
이것을 사용하면 아래와 같은 코드가 가능합니다


#include <string>
#include <iostream>

using namespace std;

template<typename T>
void LogWrite(T value)
{
	cout << "0 : " << value << endl;
	return;
}
template<typename T, typename... Args>
void LogWrite(T value, Args... args) 
{	
	cout << sizeof...(args) << " : " << value << ' ';	
	LogWrite(args...);
}

void wmain()
{
	LogWrite<int, int, double>(123, 456, 789.012);
	LogWrite(123, 456, 789.012);
}

위 코드의 출력 결과는 다음과 같습니다
01.png

인자 3개로 호출했지만, 1개는 고정인자 취급이기 때문에 2부터 시작합니다.

?

List of Articles
번호 제목 글쓴이 날짜 조회 수
77 C++ Template 의 inner class 로 type 선언 하기 Lyn 2014.10.29 23273
76 2014.10.14 일 Windows 업데이트 이후 VMWare Not enough physical memory available 오류 file Lyn 2014.10.16 19750
75 VC++ 2013 을 사용 할 경우 실행환경을 정확히 확인해야할 경우가 있습니다. file Lyn 2014.10.08 190532
74 Windows 10 Technical Preview가 출시되었습니다. Lyn 2014.10.02 7877
73 Web 솔루션의 빌드속드와 리로딩속도에 관한 비교 4 Lyn 2014.08.29 175927
72 boost::interprocess::managed_shared_memory의 동작에 관하여 Lyn 2014.08.22 208745
71 Ubuntu 14.04 libssh2-php 설치시 mysql 사라지는 버그 Lyn 2014.08.22 5715
70 Ubuntu 14.04 php용 ssh 플러그인 패키지명 Lyn 2014.08.22 16743
69 ubuntu 14.04 에서 apache rotatelogs 설치하기 Lyn 2014.08.22 30327
68 서버를 이전했습니다. Lyn 2014.08.19 28863
67 VC++ 2013 에서 빌드해서 XP에서 돌리기 file Lyn 2014.07.30 25372
66 Unity VS가 무료로 풀렷습니다. file Lyn 2014.07.30 18400
65 IIS 재시작 콘솔 명령어 Lyn 2014.04.15 21828
64 IIS 의 Application Pool 실행 계정이 ApplicationPoolIdentity 로 되어있을 경우 폴더 권한 부여 방법 Lyn 2014.04.15 50388
63 MS 애저 온라인 세미나가 있습니다 file Lyn 2014.03.11 19295
62 Visual Studio 2013 Update 1 릴리즈 Lyn 2014.01.25 10617
» Visual C++ 2013 추가기능 2. Variadic Tamplate - 1 file Lyn 2013.12.03 30718
60 MSSQL 에서 Replication 을 삭제할때 오류가 발생 할 경우 Lyn 2013.11.16 14573
59 MS가 C++AMP 를 clang+llvm 기반으로 포팅했네요. Lyn 2013.11.13 35714
58 boostpro 문 닫았네요.... file Lyn 2013.11.02 24010
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8