요소의 접근

 

tuple(0을 기점으로서) n번째의 요소는 함수 get을 개입시켜 접근 합니다. 다만 n은 정수가 아니면 안됩니다. get은 참조를 돌려주므로 좌변 값으로 이용하는 것으로 요소에 대입이 가능합니다.

    

get에 의한 참조와 대입

#include <iostream>

#include <string>

#include <boost/tr1/tuple.hpp> // tuple

 

using namespace std;

 

int main()

{

tr1::tuple exam;

tr1::get<0>(exam) = "Steve" ;

tr1::get<1>(exam) = 567;

tr1::get<2>(exam) = tr1::get<1>(exam) / 5.0;

cout << tr1::get<0>(exam) << "너의"

" 득점=" << tr1::get<1>(exam) <<

" 평균=" << tr1::get<2>(exa m) << endl;

}

 

 

  pair와의 인터페이스의 통일 때문에  pair에 대해서도 함수  get 적용할 수 있습니다.
    

pair에 대해서 get 한다

#include <iostream>

#include <string>

#include <utility>  // pair

#include <boost/tr1/tuple.hpp>// tuple

 

using namespace std;

 

int main()

{

pair police = make_pair( "???" , 110);

tr1::get<0>(police) = "순경" ;

 

cout << tr1::get<0>(police) << ':' << tr1::get<1>(police) << endl;

}

 

 

 

일괄 대입 / 일괄 참조

 

pair에 있어서 make_pair와 같이 tuple에는 함수 make_tuple 준비되어 있습니다. 또 함수  tie 에 의해서 복수의 변수를 일괄해 읽어낼 수 있습니다.

    

make_pair/tie

#include <iostream>

#include <string>

#include <boost/tr1/tuple.hpp>   // tuple

 

using namespace std;

 

int main()

{

tr1::tuple exam;

exam = tr1::make_tuple( "Steve" , 567, 567/5.0);

string name;

double mean;

// tie:사용하지 않는 요소에는 ignore(무시)를 지정 할 것

tr1::tie(name, tr1::ignore, mean) = exam;

cout << name << "너의 평균점은" << mean << endl;

}

 

 

 

비교

 

tuple의 비교 연산 == , != , <, <= , >, >= 은 각 요소를 왼쪽에서 순서 대로 비교합니다. 비교 도중에 진위가 확정하면 그 이후의 비교는 행해지지 않습니다.

     

tuple의 비교는 shortcut 된다

#include <iostream>

#include <boost/tr1/tuple.hpp>  // tuple

 

using namespace std;

 

struct Value

{

int n_;

Value( int n) : n_(n) {}

};

 

bool operator ==( const Value& x, const Value& y)

{

bool result = ( x.n_ == y.n_ );

cout << x.n_ << (result ? "==" :"!=" ) << y.n_ << endl;

return result;

}

 

bool operator <( const Value& x, const Value& y)

{

bool result = ( x.n_ < y.n_ );

cout << x.n_ << (result ? "<" :">=" ) << y.n_ << endl;

return result;

}

 

int main()

{

typedef tr1::tuple triple;

triple x(12,34,56);

triple y(12,43,56);

// 2 요소까지의 비교로 진위가 확정 되기 때문에

// 3 요소의 비교는 행해지지 않는다

cout << "x == y :" << boolalpha << (x == y) << endl;

cout << "x < y :" << boolalpha << (x < y) << endl;

}

 

< 실행 결과 >

12==12

34!=43

x == y : false

12>=12

12>=12

34<43

x < y : true

 

 

 

tuple_size,tuple_element

 

tuple_size::value Tuple의 요소 수, tuple_element::type Tuple N번째의 요소의 형태가 됩니다.

 

tuple_size, tuple_element

#include <iostream>

#include <string>

#include <boost/tr1/tuple.hpp>   // tuple

 

using namespace std;

 

// Tuple의 요소

template <<span style="font-family:굴림체; font-size:9pt; color:#0000ff;"> typename Tuple>

int members( const Tuple&)

{

return tr1::tuple_size::value;

}

 

// Tuple N번째를 '+' 한다

template <<span style="font-family:굴림체; font-size:9pt; color:#0000ff;"> int N, typename Tuple>

typename tr1::tuple_element::type

plus( const Tuple& x, const Tuple& y)

{

return tr1::get(x) + tr1::get(y);

}

 

int main()

{

tr1::tuple t1( "Hello" ,12);

tr1::tuple t2( "World" ,34);

cout << members(t1) << " members." << endl;

cout << plus<0>(t1,t2) << endl;

cout << plus<1>(t1,t2) << endl;

}

 

< 실행 결과 >

2 members.

HelloWorld

46

 

출처 : http://codezine.jp/a/article/aid/2134.aspx


by 흥배 2010. 3. 9. 08:30