2009-08-25 4 views
0
typedef boost::shared_ptr<config_value_c> config_value_ptr; 

typedef std::vector<config_value_ptr> config_value_vec; 

config_value_vec config; 

typeof (config.iterator()) it = config.iterator(); 

클래스 config_value_c에 대한 부스트 포인터 배열에 반복기를 추출하려고합니다. 나는 반복자를 std :: vector로 지정할 수 있다는 것을 안다. <config_value_ptr> :: iterator하지만 이것을 유형에 구애받지 않는 방식으로하고 싶다. 따라서 벡터를 목록으로 변경하면 다시 돌아갈 필요가 없다. 코드. 그게 가능하니? 감사.이 코드를 작성하는 올바른 방법은 무엇입니까?

저는 typeof가 실제 키워드가 아니며 typeid를 알고 있지만 원하는 것을하지 않습니다.

config_value_vec::iterator it = config.begin(); 

허용 할 C++ 표준 (C + +0)의 다음 에디션은 당신이해야 할 :

auto it = config.begin(); 
+2

'config_value_vec :: iterator'의 문제점은 무엇입니까? – avakar

답변

8

난 당신이 원하는 생각

config_value_vec::iterator it = config.begin(); 

정의되지 않은 동작이 있으므로 반복기의 생성을 피하십시오.

템플릿 방법을 쓰는 경우 typename 키워드로 진행하십시오.

template< typename Contener > 
void some_function(Contener const& contener) 
{ 
    typename Contener::iterator it = contener.begin(); 
    // do somethind with it 
} 
+0

나는이 글을 쓰고 있었다 : P 당신이 먼저 게시물에 맞을 것 같아 ... –

+0

아, 미안, 천둥을 훔쳐서 :-) –

1

을 당신이 원하는 생각 :

1

당신은 네 가지 중 하나를 수행 할 수 :

1) 곧 자동 키워드를 사용은 이미 대답했다.

2) 컨테이너 typedef에 일반 이름을 다시 지정하지 않고 유형을 변경할 수 있도록 일반 이름을 지정하십시오.

typedef std::vector<config_value_ptr> config_value_container; 

config_value_container config; 
config_value_container::iterator it = config.begin(); 

3) 컨테이너 typedef의 이름을 그대로 유지하려면 반복기 typedef를 만들 수 있습니다. 물론

typedef std::vector<config_value_ptr> config_value_vec; 
typedef config_value_vec::iterator config_value_container_iterator; 

config_value_vec config; 
config_value_container_iterator it = config.begin(); 

, 당신은 다음 몇 가지 반복자의 typedef으로 끝낼 수있는 용기 (const가 아닌 대 const를 앞으로 대 역 등)에 대한 반복자의 다른 유형을 필요로 시작합니다.

4) 컨테이너 유형에 간단한 typedef로 해결할 수없는 근본적인 차이가있을 수 있으므로 걱정하지 마십시오. 예를 들어 std :: sort는 std :: vector와 함께 사용할 수 있지만 std :: list에서는 사용할 수 없습니다. 코드가 수행하는 작업 (또는 앞으로해야 할 작업)에 따라 진정으로 유형에 구속되지 않는 상태로 유지하려고하면 가치있는 것보다 시간이 오래 걸릴 수 있습니다. 그러나 당신은 자신을 평가해야 할 것입니다.

관련 문제