Lyn
조회 수 30753 추천 수 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. VMWare 의 메모리 오류 해결 버전이 나왔습니다

    Date2014.11.06 ByLyn Views18719
    Read More
  2. C++ Template 의 inner class 로 type 선언 하기

    Date2014.10.29 ByLyn Views23316
    Read More
  3. 2014.10.14 일 Windows 업데이트 이후 VMWare Not enough physical memory available 오류

    Date2014.10.16 ByLyn Views19784
    Read More
  4. VC++ 2013 을 사용 할 경우 실행환경을 정확히 확인해야할 경우가 있습니다.

    Date2014.10.08 ByLyn Views190581
    Read More
  5. Windows 10 Technical Preview가 출시되었습니다.

    Date2014.10.02 ByLyn Views8021
    Read More
  6. Web 솔루션의 빌드속드와 리로딩속도에 관한 비교

    Date2014.08.29 ByLyn Views175995
    Read More
  7. boost::interprocess::managed_shared_memory의 동작에 관하여

    Date2014.08.22 ByLyn Views208834
    Read More
  8. Ubuntu 14.04 libssh2-php 설치시 mysql 사라지는 버그

    Date2014.08.22 ByLyn Views5838
    Read More
  9. Ubuntu 14.04 php용 ssh 플러그인 패키지명

    Date2014.08.22 ByLyn Views16771
    Read More
  10. ubuntu 14.04 에서 apache rotatelogs 설치하기

    Date2014.08.22 ByLyn Views30389
    Read More
  11. 서버를 이전했습니다.

    Date2014.08.19 ByLyn Views28894
    Read More
  12. VC++ 2013 에서 빌드해서 XP에서 돌리기

    Date2014.07.30 ByLyn Views25402
    Read More
  13. Unity VS가 무료로 풀렷습니다.

    Date2014.07.30 ByLyn Views18429
    Read More
  14. IIS 재시작 콘솔 명령어

    Date2014.04.15 ByLyn Views21858
    Read More
  15. IIS 의 Application Pool 실행 계정이 ApplicationPoolIdentity 로 되어있을 경우 폴더 권한 부여 방법

    Date2014.04.15 ByLyn Views50484
    Read More
  16. MS 애저 온라인 세미나가 있습니다

    Date2014.03.11 ByLyn Views19318
    Read More
  17. Visual Studio 2013 Update 1 릴리즈

    Date2014.01.25 ByLyn Views10638
    Read More
  18. Visual C++ 2013 추가기능 2. Variadic Tamplate - 1

    Date2013.12.03 ByLyn Views30753
    Read More
  19. MSSQL 에서 Replication 을 삭제할때 오류가 발생 할 경우

    Date2013.11.16 ByLyn Views14602
    Read More
  20. MS가 C++AMP 를 clang+llvm 기반으로 포팅했네요.

    Date2013.11.13 ByLyn Views35734
    Read More
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8