2011-01-12 2 views
1

나는 boost :: any의 벡터를 가지고 있으며이 벡터에서 'any'의 인덱스를 찾고 싶다. 이 같은boost :: any compare value?

뭔가 :

template <class T> bool IsValueEqualTo(any aniInVector, any value) 
{ 
    if (aniInVector.empty() && value.empty()) 
    return true; 

    if (aniInVector.empty() && !value.empty()) 
    return false; 

    if (!aniInVector.empty() && value.empty()) 
    return false; 

    try 
    { 
    T left = boost::any_cast<T>(aniInVector); 
    T right = boost::any_cast<T>(value); 

    return left == right; 
    } 
    catch(const boost::bad_any_cast &exception) 
    { 
    } 

    return false; 
} 

문제는 내가 애니 캐스트를 수행 할 때 지금은 캐스팅이다 : 나는 다음과 같은 방법이 개 어떤 값을 비교하려고이를 위해

vector<any> values; 
any valueISearch = ...; 
find<A*>(valueISearch); 

특정 유형 및 기본 유형에 대해 신경 쓰지 마십시오 :

class A {}; 
class B: public A {}; 
B v1; 
B v2; 
IsValueEqualTo<A*>(&v1, &v2); 

답변

1

이러한 종류의 형변환이 실패하게하는 라이브러리의 기본 제한 사항이 있습니다. 더 일반적으로 동일한 유형의 객체를 검색하려고하면 any_cast을 사용하여 boost::any에서 객체를 복구 할 수 있습니다. 예를 들어,이 작동하지 않습니다

class A { ... }; 
class B: public A { ... }; 

boost::any a = new B*; 
A* ptr = boost::any_cast<A*>(a); // Cast fails 

something that people have been complaining about for a while 내가이 해결 방법을 모른다. 제 생각에는 왜 boost::any을 다형성과 혼합하는지 먼저 고려해야합니다. 절대적으로 그렇게해야 할 가능성이 있지만, boost::any의 사용을 최소화하지 않고이 문제를 해결할 수있는 좋은 방법은 없습니다.

0

이 알고리즘은 두 개의 부스트 :: 등호를 위해 번호를하는 유형과 내용 (시도 변환 문자열에 의한 값을 비교 - 게으른 : http://signmotion.blogspot.com/2011/12/boostany.html

+1

링크 전용 대답이지만 링크가 작동하지 않습니다. –

+0

링크가 고정되었습니다. –