Lyn
조회 수 30583 추천 수 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부터 시작합니다.

?

  1. No Image 29Oct
    by Lyn
    2014/10/29 by Lyn
    Views 23095 

    C++ Template 의 inner class 로 type 선언 하기

  2. 2014.10.14 일 Windows 업데이트 이후 VMWare Not enough physical memory available 오류

  3. VC++ 2013 을 사용 할 경우 실행환경을 정확히 확인해야할 경우가 있습니다.

  4. No Image 02Oct
    by Lyn
    2014/10/02 by Lyn
    Views 7727 

    Windows 10 Technical Preview가 출시되었습니다.

  5. Web 솔루션의 빌드속드와 리로딩속도에 관한 비교

  6. boost::interprocess::managed_shared_memory의 동작에 관하여

  7. No Image 22Aug
    by Lyn
    2014/08/22 by Lyn
    Views 5557 

    Ubuntu 14.04 libssh2-php 설치시 mysql 사라지는 버그

  8. No Image 22Aug
    by Lyn
    2014/08/22 by Lyn
    Views 16602 

    Ubuntu 14.04 php용 ssh 플러그인 패키지명

  9. No Image 22Aug
    by Lyn
    2014/08/22 by Lyn
    Views 30180 

    ubuntu 14.04 에서 apache rotatelogs 설치하기

  10. No Image 19Aug
    by Lyn
    2014/08/19 by Lyn
    Views 28709 

    서버를 이전했습니다.

  11. No Image 30Jul
    by Lyn
    2014/07/30 by Lyn
    Views 25235 

    VC++ 2013 에서 빌드해서 XP에서 돌리기

  12. No Image 30Jul
    by Lyn
    2014/07/30 by Lyn
    Views 18267 

    Unity VS가 무료로 풀렷습니다.

  13. No Image 15Apr
    by Lyn
    2014/04/15 by Lyn
    Views 21706 

    IIS 재시작 콘솔 명령어

  14. No Image 15Apr
    by Lyn
    2014/04/15 by Lyn
    Views 50233 

    IIS 의 Application Pool 실행 계정이 ApplicationPoolIdentity 로 되어있을 경우 폴더 권한 부여 방법

  15. No Image 11Mar
    by Lyn
    2014/03/11 by Lyn
    Views 19188 

    MS 애저 온라인 세미나가 있습니다

  16. No Image 25Jan
    by Lyn
    2014/01/25 by Lyn
    Views 10500 

    Visual Studio 2013 Update 1 릴리즈

  17. No Image 03Dec
    by Lyn
    2013/12/03 by Lyn
    Views 30583 

    Visual C++ 2013 추가기능 2. Variadic Tamplate - 1

  18. No Image 16Nov
    by Lyn
    2013/11/16 by Lyn
    Views 14444 

    MSSQL 에서 Replication 을 삭제할때 오류가 발생 할 경우

  19. No Image 13Nov
    by Lyn
    2013/11/13 by Lyn
    Views 35600 

    MS가 C++AMP 를 clang+llvm 기반으로 포팅했네요.

  20. No Image 02Nov
    by Lyn
    2013/11/02 by Lyn
    Views 23827 

    boostpro 문 닫았네요....

Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8