글 목록 보기

Lyn
조회 수 38985 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

1. Visual Studio 2008  2010 + Intel C++ 11.1 12.1 // 개발툴.

    - Visual Assist // VS Add-on


2. Delphi 2007, Delphi 2010 XE2 //개발툴

    -Castailla // Delphi Add-on


3. VirtualBox 

가상머신 가벼워서 자주 이용


3. VMWare

VirtualBox 가 불안해서 VMWare로 완전 이사


4. TeraCopy

쉘확장. 윈도우의 파일복사/이동 기능을 확장해줌.

복사중 일부분 취소, 일시정지, Copy<->Move 전환기능 등


걍 Total Commander 쓰기로 했다. 윈도7에선 TeraCopy가 너무 느리다.


5. Microsoft Office 200 2010 // 문서


6. Total Commander

다기능 툴이지만 파일이름변경, FTP 등의 기능을 주로 이용


7. 구글 크롬

    - IE Tab

    - Gesture

초고속 웹 브라우저


8. Beyond Compare 3

파일비교 솔루션. 개발보조툴


9. Tortoise SVN, TortoiseHG

SVN 프론트엔드. 개발보조툴


10. Warcraft III, Startcraft II

게임


11. NateOn, Google Talk, MSN

메신저

?

Lyn
조회 수 40721 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

- 2010.1.3 지금 이걸 계속 써야 하나 말아야하나 고민중이다. 단돈 몇만원이 아까운게 아니라면 Beyond Compare 사서 써라. 진리다. 비교할 의미자체를 모르겠다(단. 3Way Marge 는 내가 쓰지 않아 잘 모른다)

  2011.11.22 2년사이에 많이 바뀌어서 내용을 추가


[파일비교]

Araxis Merge :

  달라진 부분을 보여주는 가이드라인이 너무 작아서 눈에 띄지 않음.

  단 선으로 바뀐 부분을 보여주기에 매우 많은 길이의 코드가 연속적으로 달라졋을 경우 직관적.

 

Beyond Compare :

  바뀐 부분을 영역색, 글씨색으로 나누어 보여주어서 보기 편함.

  달라진 부분을 보여주는 가이드라인의 길이가 화면크기와 별도로 나타나 직관적이지 않음.

  바뀐 부분이 한 줄의 일부, 아니면 몇줄 이하일 경우 직관적으로 보이나, 바뀐 부분의 길이가 길 경우, 특히 한페이지가 넘어 갈 경우는 보기가 상당히 불편하다.

 

Ultra Compare : 

  돈내고 쓸 가치가 없다. 알고리즘이 개판이다.


Kdiff

  한글 지원이 쓰레기 of 쓰레기라 배제


WinMerge

  제작자는 이 UI로 정말 코드 비교를 할수 있는지 한번 묻고싶다


[폴더비교]

Araxis Merge :

  폴더 비교 창이 매우 난잡하여 보기힘들다.

  필터가 매우 단순

  최신버전에서 필터 기능이 강력해졋다

Beyond Compare :

  알아보기 쉽게 색으로 잘 표시되어 있다.

  필터링 기능이 매우 막강하다. 특히 프로그래머가 jpg, bmp 파일을 Compare 툴로 보는것은 의미가 없는데 필터 옵션에서 아주 간단하게 걸러낼 수 있다.


[기타기능]

Araxis Merge:

  소스비교, 바이너리 비교. 그 이상의 잡기능은 없다

Beyond Compare:

  Mp3비교, 이미지 비교 등등 굉장히 다양한 포맷을 비교하는 기능을 제공한다.


[가격]

Araxis Merge :

  비싼 값에 비해, 밥값을 못한다.

  이제 밥값정돈 한다. 그래도 비싸다

Beyond Compare :

  유료이긴 하지만 비싸지 않고, 이 가격대에 이정도 툴이면 매우 훌륭하다.

 

KDiff, WinMerge : 

  싼게 비지떡이다. 정말 돈이 없다면 그때나 고민해 보자


 

PS. DiffMerge, AcroDiff 등 비교 예정

?

2009.08.19 03:08

C++ new 연산자의 진실

Lyn
조회 수 57651 추천 수 0 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

new 연산자의 진실

 

C++에서는 메모리를 할당할 때 new 연산자를 사용합니다.

그리고 이 new 라는 연산자는 오버로딩이 가능합니다. 그럼 과연 이 new 의 정체는 뭘까요?

new 를 호출하면 실제로는 malloc 이 내부에서 다시 호출 된 다는 것은 일단 다 안다고 가정하고 넘어가겠습니다.

 

첫 코드 나갑니다. 연산자 new 를 오버로딩 한 경우입니다.

#include <stdio.h>

#include <stdlib.h>

 

class Test

{

public:

           int a;

 

           void* operator new(size_t size)

           {

                     printf("한 개 할당중\n");

                     Test* temp = (Test*)malloc(size);

                     return temp;

           }

           Test()

           {

                     printf("Test Constructor\n");

           }

};

int main()

{

           Test* t1;

 

           t1 = new Test;

 

           system("pause");

           return 0;

}

 

new 에는 size_t 형태의 파라메터가 하나 존재합니다. 이 파라메터로 할당 해야 할 크기를 알려줍니다. 단순히 그 크기로 메모리를 할당 하고 리턴 만 하엿습니다.

 

실행결과는 아래와 같습니다.

 

image1.png

 

우리는 부른적도 없는 생성자가 호출되었습니다. new 가 단순히 메모리 할당만 하도록 오버로딩 하엿는데요. 여기서 new 는 실제로는 오버로딩이 되지 않았다고 할 수 있겠습니다. 뭔가 수상하군요. 디스어셈블 해 보았습니다.

 

image2.png

 

이런 우리는 new 를 호출했을 뿐인데 실제로는 operator new 라는 함수와 생성자를 따로따로 호출 하고 있었네요. 그럼 우리가 수정한 것은 operator new 라는 함수 일 뿐 new 연산자 자체가 아니라는것을 알 수 있습니다.

 

심지어 윗줄에서는 할당 할 메모리 크기를 스택에 집어넣어주는 친절함(?) 까지 엿볼 수 있군요. Pop 이 호출부위 아래에 존재한다는 것은 operator new cdecl 방식으로 call 되고 있다고 짐작 할 수 있겠습니다.

 

그럼 new 는 단지 operator new 와 생성자를 호출 하고 있을 뿐이라면 이 두 함수를 따로 따로 호출하는것도 가능하지 않을까요? 다음과 같은 코드를 짜 보았습니다.

#include <stdio.h>

#include <stdlib.h>

 

class Test

{

public:

           int a;

 

           void* operator new(size_t size)

           {

                     printf("한 개 할당중\n");

                     Test* temp = (Test*)malloc(size);

                     return temp;

           }

           Test()

           {

                     printf("Test Constructor\n");

           }

};

int main()

{

           Test* t1;

 

           t1 = (Test*)Test::operator new(sizeof(Test));

           t1:Test();

 

           system("pause");

           return 0;

}

 

그리고 실행 해 보았습니다.

 

image3.png

 

이런 완전히 똑같군요.

 

 

그럼 이렇게 결론 내릴 수 있을까요? new 연산자는 operator new 함수를 호출 한 후, 생성자를 호출 해 주는 연산자이다.

 

그런데 이게 또 아닌거 같습니다. 왜냐면 이 두 함수에는 VMT(Virtual Methor Table) 을 생성 해 주는 부분이 없거든요. 가상함수가 한 개 이상 존재하고 상속관계가 있는 클래스(상속 받았던 상속 했던) 에는 반드시 VMT의 포인터가 존재합니다. 그럼 이 VMT는 언제 등록되었을까요? 살짝 코드를 고쳐보았습니다.

 

#include <stdio.h>

#include <stdlib.h>

 

class Test

{

public:

           int a;

 

           void* operator new(size_t size)

           {

                     printf("한 개 할당중\n");

                     Test* temp = (Test*)malloc(size);

                     return temp;

           }

           Test()

           {

                     printf("Test Constructor\n");

                     func();

           }

 

           virtual void func()

           {

                     printf("Test::func()\n");

           }

};

 

class Test2 : public Test

{

           virtual void func()

           {

                     printf("Test2::func()\n");

           }

};

int main()

{

           Test* t1;

 

           t1 = new Test2;

 

           system("pause");

           return 0;

}

 

 

생성자에서 func라는 가상함수를 호출 하고 있습니다.

우리는 Test2를 생성하였으므로 Test2::func() 가 출력 될 거라고 기대 할 수 있겠습니다. 결과를볼까요?

 

image4.png

 

어라 뭔가 이상합니다. Test::func() 가 출력되었네요. 이게 어찌 된 일일까요?

그 이유는 생성자를 호출 하는 시점에서는 VMT의 포인터가 제대로 등록 되지 않기 때문에, 가상함수 본래의 역할을 제대로 하지 못하는 겁니다. 디스어셈블 한 코드를 보겠습니다.

 

image5.png

 

생성자를 호출 한 다음에도 추가적인 작업을 하고 있습니다.

그 중 빨간 네모로 표시 된 부분이 가상함수가 없을때는 존재하지 않던 부분입니다.

즉 저 부분에서 VMT포인터를 추가하는 작업을 하고 있다고 생각 할 수 있겠습니다.

 

이제 new 의 진실이 밝혀졋군요.

new 연산자를 호출하면

 

1.     메모리 할당을 위해 operator  new 함수를 호출한다

2.     생성자를 호출한다

3.     VMT를 등록해 준다

 

3가지 과정으로 new 의 역할은 모두 종료됩니다.

쉽고 편하게 쓰던 연산자가 참 하는 일도 많네요 : )

 

그럼 또 다른 언어인 Delphi 의 경우는 어떨까요?

 

program Project2;

 

{$APPTYPE CONSOLE}

 

uses

  SysUtils;

 

type

  Test = class

  public

    a : Integer;

 

    procedure func;virtual;

    constructor Create;

  end;

 

  Test2 = class(Test)

  public

    procedure func;override;

  end;

 

constructor Test.Create;

begin

  func;

end;

 

procedure Test.func;

begin

  WriteLn('Test.Func');

end;

 

procedure Test2.func;

begin

  WriteLn('Test2.Func');

end;

 

var

  T : Test;

begin

  T := Test2.Create;

  ReadLn;

end.

 

출력 결과는 아래와 같습니다.

image6.png

 

Delphi는 생성자 호출 시점이 VMT 생성 시점보다 뒤입니다.

Delphi 에서는 생성자 내에서 가상함수를 호출하더라도 정상적으로 작동합니다.

?

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

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

tokenizer 는 말 그대로 Token 단위로 문자열을 쪼개는 기능을 한다.

토큰은 사전상의 의미로는 버스탈때 내는 동전 비슷한것 (....) "의미를 갖는 최소한의 문자열" 의 의미를 갖는다. 당연히 여기에서는 후자의 의미다.

 

c 라이브러리에서는 strtok 이 제공 되지만 이는 thread 에서 사용 할 수 없다(전역변수를 사용 하기 때문에)

VCL 에서는 TStringList 가 비슷 한 기능을 제공 하고 MFC에서도 기억은 안나지만 (...) 비슷한 기능을 제공 한다.

 

뭐 항상 이야기 하는 거지만 boost 는 플랫폼을 가리지 않는 다는 것 만으로도 충분한 가치가 있다 : )

그럼 간단하게 사용 예제만 보도록 하자.

 

첫번째 예제 소스 나간다.

 

#include<boost/tokenizer.hpp>

#include<string>

#include<iostream>

 

using namespace std;

using namespace boost;

 

typedef tokenizer<char_separator<char> > TOKC;

int main(int argc, _TCHAR* argv[])

{

         string BorlandUser = "Lyn/Yull/TestCode/Imp//bkyang/4000king/RyuJT/gilgil/esniper/civilian";        

         char_separator<char> sep("/",""); 

        

         TOKC tok(BorlandUser, sep);       

 

         for (TOKC::iterator i = tok.begin(); i != tok.end(); ++i)

         {

                  cout << *i << endl;

         }

         return 0;

}



 

문자열을 '/' 단위로 쪼개기로 하자.

그럼 결과는 아래와 같다.

 

1.png

잘 쪼개 졋다. 그런데 한가지 주의해서 볼 점이 있는데 빈 토큰은 나타나지 않는 다는 것이다.

빈 토큰도 살리기 위해서는 separator 의 생성자에 keep_empty_tokens 옵션을 주면 된다.

 

두번째 예제를 보자

#include<boost/tokenizer.hpp>

#include<string>

#include<iostream>

 

using namespace std;

using namespace boost;

 

typedef tokenizer<char_separator<char> > TOKC;

int main(int argc, _TCHAR* argv[])

{

         string BorlandUser = "Lyn/Yull/TestCode/Imp//bkyang/4000king/RyuJT/gilgil/esniper/civilian";        

         char_separator<char> sep("/","", keep_empty_tokens);

        

         TOKC tok(BorlandUser, sep);       

 

         for (TOKC::iterator i = tok.begin(); i != tok.end(); ++i)

         {

                  cout << *i << endl;

         }

         return 0;

}

 

2.png

 

빈 토큰도 구해진 것을 볼 수 있다 : )

참여해 주신 볼랜드(코드기어? 엠바카데로?) 유저분에게 심심한 감사를 표하면서 끝내겠다 (__)



PS. 유니코드 일 경우 typedef tokenizer<char_separator<wchar_t>, wstring::const_iterator, wstring> TOKC; 와 같이 선언하는것이 편리하다

?

Lyn
조회 수 41614 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

이번엔 공백 처리 함수들이다. 로그인할때 아이디 처리라던지에 써먹은 기억이 있다 : )


#include <cstdio>

#include <string>

#include <boost/algorithm/string.hpp>

 

using namespace boost;

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

        string str1 = "   I love Lyn!      ";

        string str2;

        trim(str1); //양옆의공백을다제거한다.

        printf("trim : %s\n", str1.c_str());

 

        str1 = "   I love Lyn       ";

        str2 = trim_copy(str1); //양옆의공백을다제거하되원본을변경하지않고새로운문자열을리턴

        printf("trim_copy : %s, %s\n", str1.c_str(), str2.c_str());

 

        str1 = "#######   I love Lyn       #######";

        trim_if(str1,is_any_of("#")); //제거할문자를직접지정해서제거한다.

        printf("trim_if-1 : %s\n", str1.c_str());

 

        str1 = "!@#!@#I love Lyn!@#!@#";

        trim_if(str1,is_any_of("!@#")); //제거할문자열의길이에는제한이없다!

        printf("trim_if-2 : %s\n", str1.c_str());

 

        str1 = "   I love Lyn       ";

        trim_left(str1); //왼쪽의공백을제거한다.

        printf("trim_left : %s\n", str1.c_str());

       

        //물론trim_left_copy, trim_left_if, trim_right, trim_right_copy, trim_right_copy_if 등등.. 있을함수는다있다.

        //여기서는몇가지만소가했지만네이밍규칙을보면다알수있을수준이다.

        return 0;

}

 

?

Lyn
조회 수 41569 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

이번엔 문자열 다루는 알고리즘 들이다.
C++ 기본 라이브러리에서 당연히 지원 해줄것 같은데 안해주는(...) 문자열 관련 함수들을 담고 있다.
첫번째로 대소문자 변경 기능만 살펴본다.

String 알고리즘은 원본을 변형하는 형태와, 원본을 보존하고 새로운 문자열을 리턴하는 두가지 형태로 지원되는점이 특징이다.

#include <string>

#include <boost/algorithm/string.hpp>

 

using namespace std;

using namespace boost;

 

int _tmain(int argc, _TCHAR* argv[])

{

        string str = "Hello Lyn!";

        string str2;

        printf("%s\n", str.c_str());

 

        to_upper(str); //모두대문자로바꾼다

        printf("%s\n", str.c_str());

        to_lower(str); //모두소문자로바꾼다

        printf("%s\n", str.c_str());

       

        str = "Hello Lyn!";

        str2 = to_upper_copy(str); //모두대문자로바꾸되원본을변형하지않고새로운문자열을리턴

        printf("%s %s\n", str.c_str(), str2.c_str());

        str2 = to_lower_copy(str); //모두소문자로바꾸되원본을변형하지않고새로운문자열을리턴

        printf("%s %s\n", str.c_str(), str2.c_str());

 

        return 0;

}

?

Lyn
조회 수 41307 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

이번엔 lexical_cast 에 대해서 알아보자.
cast 란 이름에서 눈치챗겠지만 일종의 캐스팅 연산자(인 척 하는 함수) 이다.
string -> Integer 같은 상식적으론 말이 되지만 C++문법상으론 말이 안되는 일들을 처리한다.

일단 예제코드를 소개한다.
timer 에 관해서는
http://lunapiece.net/3795 를 참조해라

#include <boost/lexical_cast.hpp>

#include <cstdlib>

#include <string>

#include <boost/timer.hpp>

 

using namespace std;

using namespace boost;

 

string Number = "1024768";

 

void StrToIntAtoi()

{

        int num;

        for(int i=0;i < 1000000; ++i)

        {

               num = atoi(Number.c_str());

        }

        printf("atoi : %d\n", num);

}

void StrToIntStringStream()

{

        stringstream sst;

        int Num;

        for(int i=0;i < 1000000; ++i)

        {

               sst << Number.c_str();

               sst >> Num;

        }

        printf("StringStream : %d\n", Num);

}

void StrToIntLexicalCast()

{

        int num;

        for(int i=0;i < 1000000; ++i)

        {

               num = lexical_cast<int>(Number);

        }

        printf("LexicalCast : %d\n", num);

}

int _tmain(int argc, _TCHAR* argv[])

{

        timer t;

        printf("atoi 를이용한방법\n");

        t.restart();

        StrToIntAtoi();

        printf("%lf \n", t.elapsed());

 

        printf("StringStream 을이용한방법\n");

        t.restart();

        StrToIntStringStream();

        printf("%lf \n", t.elapsed());

 

        printf("lexical_cast 를이용한방법\n");

        t.restart();

        StrToIntLexicalCast();

        printf("%lf \n", t.elapsed());

 

        return 0;

}

 

.....

예제코드 자체는 별 문제가 없었으리라 본다. 준비작업도 필요없고 간단하게 쓸 수 있어서 참 좋아보이기는 한다.
하나의 함수로 이런저런 캐스팅을  다 할수 있으니 다형성도 뛰어나다.
그러나 치명적인 문제가 딱 하나 있는데...

 

 

바로 이거다 속도 =_=;

stringstream 에 비해 약 10배, atoi 에 비해선 대략 50배 가량 느리다 =_=;; 편의성을 위해서 가끔 쓰는정도라면 몰라도 자주 반복되는 루틴에서는 쓰지 않아야 하겠다.

?

Lyn
조회 수 36650 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

multi_array는 다차원 정적배열을 지원하는 클래스이다.
이를 이용하는 다른 방법은 std::tr1::array 를 중첩해서 사용 하는 방법이 있는데, 이것을 좀 더 편하게 확장했다고 보면 되겠다.

std::tr::array에 관한 내용은 아래 링크를 참조해라
http://lunapiece.net/Article/476

 

아래는 multi_array와 중첩된 array에 관한 예제코드이다. 이것도 별 내용이 없다보니 그냥 코드 보여주는걸로 끝낸다.

 

#include "stdafx.h"

#include <array>

#include <multi_array.hpp>

#include <cstdio>

 

using namespace boost;

 

int _tmain(int argc, _TCHAR* argv[])

{

        //TR1Array를이용한Static Array of Array 구현

        printf("std::tr1::array<std::tr1::array<int,20>, 10>\n");

        std::tr1::array<std::tr1::array<int,20>, 10> Stdarr; //int[10][20] 선언

        //10*20인데선언시에는숫자가반대로씌여지므로헤깔린다!

        for (int i = 0; i < 10; ++i)

        {

               for(int j = 0;j < 20; ++j)

               {

                       Stdarr[i][j] = 1;

               }

        }

 

        //boost::multi_array

        printf("multi_array 사용\n");

        multi_array<int, 2> MultiArray(extents[10][20]);

        //int2차원배열[10][20]을선언. 템플릿인자가Type 과차원을나타냄.

        for (int i = 0; i < 10 ; ++i)

        {

               for(int j = 0;j < 20; ++j)

               {

                       MultiArray[i][j] = 2;

               }

        }

       

        printf("multi_array range 조정\n");

        //Pascal 처럼배열의인덱스를변형할수있는기능을제공한다.

        typedef multi_array<int, 2>::extent_range range; //이름이너무길어서ㅡ.

        multi_array<int, 2> MultiArray2(extents[range(1,4)][range(20,40)]);

        //Pascal 과비교하면Array [1..4-1] of Array[20..40-1] of Integer 라고할수있겠다.

        for (int i = 1; i < 4 ; ++i)

        {

               for(int j = 20;j < 40; ++j)

               {

                       MultiArray2[i][j] = 2;

               }

        }

        return 0;

}

 

 

 

?

Lyn
조회 수 44099 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

이번에는 timer 클래스이다.
단순히 시간을 재는데 이용 할 수 있는 클래스로 알고리즘 돌려놓고 시간측정하기 딱좋다.
아래 pool 예제 등에서도 이 timer 를 사용햇으면 더 편햇을텐데... 어쩌다 보니 이게 뒤로나왔다.

#include "boost/timer.hpp"

#include <cstdio>

#include <windows.h>

 

using namespace boost;

 

int main(int argc, char **argv)

{

        timer t; //생성시0으로초기화

        Sleep(1234);

        printf("%lf 초지남\n", t.elapsed());

        Sleep(1766);

        printf("%lf 초지남\n", t.elapsed());

        t.restart();//Restart 를이용하여다시초기화

        Sleep(512);

        printf("%lf 초지남\n", t.elapsed());

        return 0;

}

 

?

2009.05.11 22:44

[Boost 살펴보기] 2. any

Lyn
조회 수 36607 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

any 는 마치 스크립트 언어처럼 임의의 type을 가지는 변수를 만들 수 있다.
COM의 Varient 와도 비슷하다 하겠다.

하지만 이것을 언어수준에서 구현 해 놓았고, 다른 컨테이너와 매우 잘 맞물린다는것이 장점이라 하겠다.
vector 에 이런저런 잡데이터 쑤셔넣을때 참 좋더라
(당연히 오버헤드는 있다. 꼭 필요한 곳에만 사용하자!)

#include "stdafx.h"
#include <cstring>
#include <cstdio>
#include <boost/any.hpp>
#include <string>
#include <vector> 

using namespace boost;

using namespace std;

 

struct MyData

{

        int i;

        double d;

        MyData()

        {

        }

        MyData(const MyData& t) //Any의요구사항1 Copy Constructor

        {

               this->i = t.i;

               this->d = t.d;

        }

        MyData& operator =(const MyData &t) //Any의요구사항2 = operator overloading

        {

               this->i = t.i;

               this->d = t.d;

        }

};

int _tmain(int argc, _TCHAR* argv[])

{

        any Data;

        //값이비어있는지를확인하는방법

        if(Data.empty())

        {

               puts("Data 는비어있음!");

        }

        else

        {

               puts("Data 는비어있지않음!");

        }

        Data = 3.14; //실수리터럴의기본타잎은double

        Data = 3; //정수리터럴의기본타잎은Int

 

        //Data = "Hello!"; //에러.

        //any 에넣기위해선CopyConstructor = Operator Overloading 이필요하다.

        string str = "Hello";

        Data = str; //정상적

 

        //Any 에어떤타잎이들어있는지확인

        //type매소드로type 을확인후any_cast 연산자를사용하여캐스팅

        if(Data.type() == typeid(int))

        {

               printf("DataType : Int, Value : %d\n", any_cast<int>(Data));

        }

        else if(Data.type() == typeid(double))

        {

               printf("DataType : Double, Value : %lf\n", any_cast<double>(Data));

        }

        else if(Data.type() == typeid(string))

        {

               printf("DataType : string, Value : %s\n", any_cast<string>(Data).c_str());

        }

 

        //Vector Any 의복합사용예.

        printf("임의의타잎을담는Vector 선언하기\n");

        vector<any> AnyVector;

        MyData myData;

        myData.d = 5.12;

        myData.i = 5;

 

        AnyVector.push_back(3);

        AnyVector.push_back(3.14);

        AnyVector.push_back(myData);

 

        vector<any>::iterator it;

        for (it = AnyVector.begin(); it != AnyVector.end(); ++it)

        {

               if(it->type() == typeid(int))

               {

                       printf("Any Type : Int, Value : %d\n", any_cast<int>(*it));

               }

               else if(it->type() == typeid(double))

               {

                       printf("Any Type : Double, : %lf\n", any_cast<double>(*it));

               }

               else if(it->type() == typeid(MyData))

               {

                       printf("Any Type : MyData, Value : %d, %lf\n", any_cast<MyData>(*it).i, any_cast<MyData>(*it).d);

               }

        }

        return 0;

}

 

 

?

Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 Next
/ 14