2011-05-03 2 views
2

boost::any을 사용하면 매우 유용하지만 게터가 없다는 것은 매우 우울합니다. 항상 우리가 원하는 형식으로 캐스팅하는 데 any_cast을 사용해야합니다. 그런데 왜 그런 일이 없습니까? 내 의견으로는 벨로우즈가 유용 할 수 있습니다. 내가 볼 수없는 나쁜 것들이 있습니까?boost :: any에 "getter"가없는 이유는 무엇입니까?

template <class T> 
void get(T * handle) 
{ 
    *handle = boost::any_cast<T>(*this); 
} 

편집 :이 게터는 할당 연산자를하는 데 필요한

내가 볼 수있는 유일한 나쁜 일.

+3

그리고 그 차이는 ..? –

+1

왜이 방법이 any_cast보다 우수합니까? –

+0

아마도 "우울하다"는 뜻인가요? –

답변

5

아마 any_cast과 똑같은 동작을하기 때문에 설명이 어려울 것입니다. any_cast은 캐스트, 유형 변환을 수행하고 있음을 나타냅니다. 당신은 개체의 값을 얻으려고을 시도하고 있습니다. 따라서 잘못된 유형으로 호출하면 작업이 실패 할 수 있다는 것은 사용자에게 분명합니다.

get 장애 조건에 대한 기능이 덜 명확합니다. 나는 일반적으로 단순히 get이라는 함수가이 될 수 있다고 기대하지 않습니다. 그리고 만약 그렇다면, 나는 그것의 의미를 확신하지 못합니다.

get 기능을 원하면 boost::variant을 사용해야합니다. 여부 캐스트의 실패 건축에 사용되는 정확한 유형에 매우 민감하기 때문에

2

any_cast와 요점은, 템플릿 인수 공제를 사용하는 사람들 하지을 강제하는 것입니다.

이 사용은 분명하다

any x(2); // store an int 
double f = any_cast<int>(x); // ok, request for an int, then cast to double 

이 하나가되지 않습니다 :

실제로
int g; 
... 
x.get(&g); // Ok. For now. 

, 당신은 당신의 코드를 리팩토링 지금 상상, 당신은

에 의해

int g; 

교체

double g; 
이 가능성이 디버그에 몇 시간 반을 잃는 것
double g; 
... // There can be 100s of lines here 
x.get(&g); // This line HAS changed semantics and cast will fail 

처럼

지금, 새로운 코드 보인다.