C의 생소한표현..

ㅡ,.ㅡ;;의 이미지

전에보고 그냥지나 쳤는데.
궁굼해서그런데

#include <vector>
#include <iostream>

vector<void *(*)(void *)> thread_list;
vector<pthread_t> tident(10);

이런표현이 일반적인 C 에서는 없는걸로 아는데 어떻게 된거죠?

일단 인클루드도 파일이아닌듯하고 <> 사용한것과 마지막의 () 사용한것

bugiii의 이미지

C++의 template 입니다. 魔의 세계로 오신 것을 환영합니다... 하면 할수록 너무 어려워요 template...

첫번재는 vector 라는 템플릿을 이용해서 쓰레드 실행 함수의 포인터를 담는 thread_list 라는 동적 배열 변수를 만든 것이고,

두번째는 쓰레드 핸들 값을 담는 초기 크기가 10인 tident 벡터를 만든 것입니다.

idlock의 이미지

C#도 자바도 다음 버전 스펙을 보면 다 템플릿이 들어가 있더군요. -.-

Quote:
魔의 세계로 오신 것을 환영합니다...

:twisted:

ㅡ,.ㅡ;;의 이미지

그렇군요. 인터넷뒤지다 어떤예제에 나오길래 먼가 했더니..


----------------------------------------------------------------------------

seoleda의 이미지

저는 요즘 STL을 하도 많이 써서, STL이 지원되지 않는 컴파일러를 보면 왠지 나뻐보입니다.
머 직접 템플릿을 작성하지는 않지만, STL이 없는 환경에선 프로그램 하라면.. 음.. 생각만으로도 끔찍합니다.

죠커의 이미지

매우 멋진 세계이지요 :-)

template<bool> struct CTAssert;
template<> struct CTAssert<true> {};

이 두줄을 보았을때 감동을 잊을수가 없습니다.
저 두줄을 보지 않았다면 C++을 접었을 겁니다.

맹고이의 이미지

템플릿 없는 C++은 반쪽짜리라고 생각합니다... :D

bugiii의 이미지

CN wrote:
매우 멋진 세계이지요 :-)

template<bool> struct CTAssert;
template<> struct CTAssert<true> {};

이 두줄을 보았을때 감동을 잊을수가 없습니다.


그 책인가요?
죠커의 이미지

bugiii wrote:
CN wrote:
매우 멋진 세계이지요 :-)

template<bool> struct CTAssert;
template<> struct CTAssert<true> {};

이 두줄을 보았을때 감동을 잊을수가 없습니다.


그 책인가요?

저 두줄은 그 책을 보기전에 보고 한참동안 고민했었지요.
빨리 그 책을 볼걸 후회했었습니다. :-)

bugiii의 이미지

맹고이 wrote:
템플릿 없는 C++은 반쪽짜리라고 생각합니다... :D

앙꼬없는 찐빵이 더 적절하지 않을까요? :lol:

p.s. 앙꼬없는 찐빵은 틀린 말이라고 하네요.

http://www.welovetravel.net/life/diary/k960501.htm
http://www.korean.go.kr/nkview/nknews/199910/15_11.htm

속없는 팥빵이라고 해야 하나요? 팥없는 팥빵이라고 해야 하나요?

kuma의 이미지

저는 책만 몇번 보고 포기했습니다 :oops:

너무 어려운것 같아요. 꺽쇠만 봐도 머리가 어질어질

책 볼때는 아하 그랬다가 막상 남들이 사용한 코드나 내 프로그램에 적용시켜보려하면 막막하네요. 머리가 아는것과 손이 아는것은 다른것 같습니다. :cry:

질문 :
1. void* 를 쓰지 않고 굳이 꺽쇠를 달아가며 쓰는 잇점이 뭘까요? 코딩할때 번잡스럽지는 않나요?

2. 캐스팅 연산자가 다양하게 추가 되어 있는데, 이것도 많이들 쓰시나요? 기존 캐스팅 연산자에 비해 우월한 점을 몰라 못쓰고 있습니다. :cry:

hackexpert의 이미지

kuma wrote:
저는 책만 몇번 보고 포기했습니다 :oops:

1. void* 를 쓰지 않고 굳이 꺽쇠를 달아가며 쓰는 잇점이 뭘까요? 코딩할때 번잡스럽지는 않나요?

2. 캐스팅 연산자가 다양하게 추가 되어 있는데, 이것도 많이들 쓰시나요? 기존 캐스팅 연산자에 비해 우월한 점을 몰라 못쓰고 있습니다. :cry:

1. 사용하는 타잎에 제한을 가할 수 있으면서도 코드를 중복해서 적을 필요가 없습니다.
- 자바의 Object기반의 HashTable 같은 걸 IntHashTable 로 만들려면
상속 받아서 어찌고 저찌고...

2. 모어 이펙티브 c++이었나? 에 보면 설명이 되어 있긴합니다만..
캐스팅 연산자의 쓰임이 제한적이라 왜 캐스팅을 하는지 좀 더 쉽게 파악이 가능합니다..
그리고 책에 나온대로 하나 적자면 c 스탈보다 눈으로 찾기 쉽습니다..

요즘 어쩔 수 없이 자바를 보고 있는데
자바에도 템플릿 같은게 있으면 좋겠습니다.. ㅋ
범용적으로 만들자니 사람들끼리 소스 공유할때 문제가 생기고..
제한시키자니 래퍼 만드는 것 다 노가다 해줘야 되고.. ;;

bugiii의 이미지

1. typedef 를 적극적으로 사용한다면 새로운 클래스를 사용하듯이 크게 불편한 것은 없었습니다. void* 를 담는 컨테이너도 훌륭하지만, 일반적인 단일한 요소를 담는 컨테이너라면 템플릿이 좀 더 낫다고 생각합니다. MEC 엔가 그 내용이 있었던걸로 기억합니다.

2. 불편하게 만들어서 그것을 사용하지 않는 프로그래밍으로 유도하는 의도도 있지 않을까요? ^^; 저는 필요한 경우라면 용도에 맞게 최대한 사용하려고 노력합니다. 이것도 MEC에 있었던 걸로...

그 책은... 정말 지독하게 템플릿화 하려는... 절정에 달한 고수들이나 완벽하게 사용할 수 있는 템플릿으로 완전히 도배한 책 아닙니까...

저는 저자의 ScopeGuard를 자주 사용하구요.
http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/

스마트 포인터의 개념과 필요한 사항을 아주 자세하게 분석하고 구현한 부분을 감명 깊게 봤습니다. (복잡했던 스마트 포인터에 대한 생각을 아주 잘 정리해줘서 정말 고맙게 생각합니다.)

그리고, 그 책에서 제시하는 작은 메모리 할당과 싱글톤도 사용하면 아주 좋겠다는 생각이 들었지만 아직 사용해보지는 못했습니다.

kuma의 이미지

bugiii 님의 답글 한방에 뻥 뚤리는 기분입니다. 감사합니다. :D

걸리적 거리는 꺽쇠를 매번 질질끌며 다니는 초보적인 소스만 봐와서 :oops:

하지만 아직도 캐스팅 연산자에 대해서는 잘 모르겠네요 :cry:

bugiii의 이미지

reinterpret_cast 가 정말 불편하다... 그러면

template< typename T1, typename T2 >
T1 CAST( T2 v_ )
{
    return reinterpret_cast< T1 >( v_ );
        or
    return (T1)v_;
}

정도로 하시면 조금이라도 키보드를 덜 칠 수 있긴 합니다... -_-; 그냥 C 캐스트처럼 행동하게 하고 싶다면 위 함수 내용을 C 캐스트 문장으로 바꾸시면 되구요... 뭐... 그렇다는거구요... (C++ 캐스트 연산자를 사용할 때 모양이 왜 그 모양인지 보여드리기 위해서 사용한 코드니까요... 이런식으로 실무에서는 사용한 적이 없습니다. 아마 구형 컴파일러에서나 이런 것이 필요할지도...)

왜 그런 형태의 캐스트 연산자인가는 Stroustrup 의 The C++ Programming Language 의 implicit_cast 를 보고서 알았습니다.

그런데, 이 C++ 캐스트라는 것이 꼭 필요한 경우가 있긴 하지만, 안쓰고도 디자인을 바꾼다거나 해서 피할 수 있는 경우도 있으니까요. MEC를 꼭 한번...

const_, static_, dynamic_, reinterpret_ 전부 다 필요하니까 (그 표준 정하는 분들이 아무 생각없이 넣지는 않았겠죠.) 있는 것이겠죠... 용법과 사용처는 미리미리 공부해서 나중에 약 잘못 처방해서 환자가 사망하거나 하는 그런 일이 없도록 주의합시다... -_-;

죠커의 이미지

kuma wrote:
질문 :
1. void* 를 쓰지 않고 굳이 꺽쇠를 달아가며 쓰는 잇점이 뭘까요? 코딩할때 번잡스럽지는 않나요?

약간 질문의 답과는 다른 내용이지만 템플릿은 자료를 담는 그릇 이상의 것이라고 생각합니다.

template<bool> struct CTAssert; 
template<> struct CTAssert<true> {}; 

그것을 보여주는 것이 위의 코드입니다.
CTAssert<(1 + 5) == 3> onePlusFiveTest;

위의 코드는 컴파일 할때 에러가 뜹니다.

bool에 대한 템플릿 객체를 만들고 true 부분만 구현했습니다. 만약에 안에 들어있는 값이 참이라면 비어있는 객체가 만들어지고 끝이나지만 거짓이라면 false가 구현이 되어있지 않기 때문에 에러가 뜨고 맙니다.

템플릿은 기본적인 if문 같은 역활과 재귀문 같은 역활을 할 수 있고 모든 과정은 컴파일 타임에 검증되고 오버헤드는 사라져 버립니다. :-)

랜덤여신의 이미지

CN wrote:
kuma wrote:
질문 :
1. void* 를 쓰지 않고 굳이 꺽쇠를 달아가며 쓰는 잇점이 뭘까요? 코딩할때 번잡스럽지는 않나요?

약간 질문의 답과는 다른 내용이지만 템플릿은 자료를 담는 그릇 이상의 것이라고 생각합니다.

template<bool> struct CTAssert; 
template<> struct CTAssert<true> {}; 

그것을 보여주는 것이 위의 코드입니다.
CTAssert<(1 + 5) == 3> onePlusFiveTest;

위의 코드는 컴파일 할때 에러가 뜹니다.

bool에 대한 템플릿 객체를 만들고 true 부분만 구현했습니다. 만약에 안에 들어있는 값이 참이라면 비어있는 객체가 만들어지고 끝이나지만 거짓이라면 false가 구현이 되어있지 않기 때문에 에러가 뜨고 맙니다.

템플릿은 기본적인 if문 같은 역활과 재귀문 같은 역활을 할 수 있고 모든 과정은 컴파일 타임에 검증되고 오버헤드는 사라져 버립니다. :-)

야.... 신기한 사용방법이군요.

템플릿에 이렇게 기능이 많을 줄이야...

alwaysN00b의 이미지

barosl 님 20세기에서 오셨군요.. ㅋㅋ..

-_-;; 잡담이고..

이제 막 C++을 시작한 저에겐 템플릿이 저렇게 다양한 기능이 있는지
몰랐군요. 흠. Effective C++을 보고있는데 아직도 이해가 잘... --;;

언제나 시작

jj의 이미지

void*와는 차원이 다르죠. void*와 같은 기능에 타입안정성까지 보증한다고 보시면 될듯...

내년쯤에 쓰실 JDK(1.5)에는 템플릿이 들어가겠지요. 지금 베타버젼 사용하실 수 있구요.

--
Life is short. damn short...

bootmeta의 이미지

template의 많은 특성이 모든 compiler에서 지원되지 않습니다.
따라서 아주 portable한 code를 짤때는 template을 사용안하는 경우가 좋을수도 있습니다.
예로 visual.net은 그래도 좀 낫지만 visual c 6.0에서 지원안하는 특성땜시
재작성한 코드도 많았져..흐흑... stlport같은 것을 쓰면 그나마 stl부분은 낫지만 사용자가 만는 template library는 호환은 꿈도 꾸지 말아야 할 수도...
(사족으로 portable c,c++코드 작성시 주의는 www.mozilla.org에서 호환부분을 참조)
또 개발시 한번 template구문에서 에러가 생기면 에러 찾기가 첩첩산중일 수 있습니다.. 그래서 마의 세계져....

정태영의 이미지

ㅡ,.ㅡ;; wrote:
전에보고 그냥지나 쳤는데.
궁굼해서그런데

#include <vector>
#include <iostream>

vector<void *(*)(void *)> thread_list;
vector<pthread_t> tident(10);

이런표현이 일반적인 C 에서는 없는걸로 아는데 어떻게 된거죠?

일단 인클루드도 파일이아닌듯하고 <> 사용한것과 마지막의 () 사용한것

c++의 헤더를 .. include할때는.. .h를 뺍니다 ;)
=3=33

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

withlhw의 이미지

C의 생소한 표현이라고 적으셨는데.. C++이군요...

순간 놀랬어요.. 어찌 C 컴파일러가, 템플릿을 이해할 수 있는지에 대해서요.

lifthrasiir의 이미지

Generic에 대해서 잘 몰랐는데 저런 활용도 가능하군요 ;) 역시 템플릿은 단순하게 형만 담아 두는 게 아니었다는 걸 깨달았습니다.

- 토끼군

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.