반응형

Kevlin Henney

소개
예제
참고문서
값 타입 조건들
헤더 <boost/any.hpp>
감사인사

소개

일반적인( 템플릿 기반 프로그래밍에 대조되는 일반적인 의미에서) 타입이 필요합니다

: 실로 변하기 쉬운 변수들, 일반의 엄밀한 그리고 정적인 타입들보다 많은 다른 더 구체적인 타입들의 값에 부합하는 것.

우리는 일반적인 타입의 3가지 기본 종류들을 구분할 수 있습니다.

  • 가능한 값 타입들(예를들면 int 와 string)의 다수중 하나를 유지할 수 있는 변환하는 타입들, 그리고 자유롭게 그들 사이에서 자유롭게 변한다. (예를들면 5 를 "5" 또는 그반대의 경우도 해석하는것)
    그러한 타입들은 스크립팅과 그밖의 해석되어지는 언어 안에서 공통입니다.
    boost::lexical_cast 는 그러한 변환 기능을 제공한다.

  • 다른 타입들의 값 그러나 그들(즉 5는 "5" 또는 5.0 둘중 한쪽으로 절대 변환되어지 않고 int 로서 정확하게 유지된다 )
    사이에서 변환을 시도하지 않는 구별되는 타입들.
    단일값들의 일반적인 컨테이너들, 타입의 인지를 제외하고 해석에 대해 그것들의 동작없음은 그것들을 해석이가능한 변환으로부터 얘기치 않은 일에대해 범위없이 효과적으로 안전하게합니다.

  • 접근과 프로그래머에 대한 해석의 모든 형태들을 맡기면서, 무엇이든 참조할수있는 하지만 실제 기본 타입에대해 염두하지 않는 분간없는 타입들.
    이 일은 void* 에 의해 지배되어집니다 그것은 얘기치 않은 일, 분명하지 않은 행동에 대한 범위의 다량을 줍니다.

( C++ Report 12(7), July/August 2000, Kevlin Henney에 의해 "높이평가되는 변환들" 에서 설명되어진 같은 이름들의 클래스에 기초로되어진)

boost::any 클래스는 두번째 범주에 기반되는 변하기 쉬운 값 타입입니다.

boost::any는 어떤 값 타입과 boost::any의 타입에 정확하게 반대되는 어떤 값의 안전 점검된 추출의 복사를 지원합니다.

더 많은 적절한 연산들을 제공하기때문에, 유사한 디자인은 일반적인 함수 어뎁터(adaptor),any_funtion, 일반적인 iterator adaptor, any_iteator, 그리고 균일한 런타임 처리를 필요로하는 다른 오브젝트 타입들에 사용할수있습니다.

최근 2009 7월 26일, at 21:11:03 +0100 에 수정되었습니다.


예제

다음의 코드는 어떤 오브젝트들의 암시적 변환과 복사를 사용하는 것에 대해 문법을 설명합니다 :


#include <list>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::list<boost::any> many;

void append_int(many & values, int value)
{
    boost::any to_append = value;
    values.push_back(to_append);
}

void append_string(many & values, const std::string & value)
{
    values.push_back(value);
}

void append_char_ptr(many & values, const char * value)
{
    values.push_back(value);
}

void append_any(many & values, const boost::any & value)
{
    values.push_back(value);
}

void append_nothing(many & values)
{
    values.push_back(boost::any());
}

다음은 이전 정의들로부터 흐름을 설명하고 어떤 오브젝트들에 대한 조건들의 사용을 설명합니다 :

bool is_empty(const boost::any & operand)
{
    return operand.empty();
}

bool is_int(const boost::any & operand)
{
    return operand.type() == typeid(int);
}

bool is_char_ptr(const boost::any & operand)
{
    try
    {
        any_cast<const char *>(operand);
        return true;
    }
    catch(const boost::bad_any_cast &)
    {
        return false;
    }
}

bool is_string(const boost::any & operand)
{
    return any_cast<std::string>(&operand);
}

void count_all(many & values, std::ostream & out)
{
    out << "#empty == "
        << std::count_if(values.begin(), values.end(), is_empty) << std::endl;
    out << "#int == "
        << std::count_if(values.begin(), values.end(), is_int) << std::endl;
    out << "#const char * == "
        << std::count_if(values.begin(), values.end(), is_char_ptr) << std::endl;
    out << "#string == "
        << std::count_if(values.begin(), values.end(), is_string) << std::endl;
}

OMG의 property 서비스를 본떠서 만들어 졌기때문에, 타음의 타입들은 임의의 값 타입들에 대해 name-value 쌍들을 정의합니다 :

struct property
{
    property();
    property(const std::string &, const boost::any &);

    std::string name;
    boost::any value;
};

typedef std::list<property> properties;

다음의 기본 클래스는 임의의 인자 타입들 또한 필요로하는 콜벡들에 기반을 둔 런타임 다형성에 하나의 접근을 설명합니다 :

class consumer
{
public:
    virtual void notify(const any &) = 0;
    ...
};



참고문서

ValueType 필요조건들

값들(values)은 독자성이 중요하지 않은 견고한 정보의 오브젝트들이다, 즉 주안점은 대게 그것들의 상태와 그것들 주위에

조직화된 행동이다.

값들에 대해 또 하나의 구별되는 특징은 그것들의 단위이다:

예를들자면 보통은 다수와 같은 시스템안에서 간단한 개념들을 나타내는 조직적인 오브젝트들이다

한 값의 주안점은 그것의 상태안에 놓여있는것으로 그것은 독립성이 아니다,

값들이 복사되어질수 있고 대체적으로 다른것에서 하나가 할당 되어질수 있다,

public 복사생성자와 public 할당 operator의 명시적 또는 묵시적 정의를 필요로 하면서...

값들은 힙에 보다는 대체로 다른 범위들 즉 오브젝트들 또는 블럭들 내부에 남아있다

값들은 그러므로 보통 전달되어지고 곧장 조작되어진다 값들 또는 참조를 통함으로서...

하지만 독립성과 간접적인 방법을 잘 나타내는 포인터로서가 아닌..

any 에 사용되어지기 위한 값타입들에 대한 구체적인 필요조건이다 :

  • ValueType 은 복사생성되어진다[20.1.3].
  • ValueType 은 선택적으로 할당되어진다[23.1]. 강한 예외안전보장은 할당의 모든형태들에 필요하다.
  • ValueType에 대한 파괴자는 예외를던지지않는 예외안정보장성을 유지시킨다.

Header <boost/any.hpp>

namespace boost {
  class bad_any_cast;
  class any;
  template<typename T> T any_cast(any &);
  template<typename T> T any_cast(const any &);
  template<typename ValueType> const ValueType * any_cast(const any *);
  template<typename ValueType> ValueType * any_cast(any *);
}

Copyright © 2001 Kevlin Henney

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)



번역된 원문 http://www.boost.org/doc/libs/1_51_0/doc/html/any.html

http://www.boost.org/doc/libs/1_51_0/doc/html/any/s02.html

반응형

+ Recent posts