2009-08-25 2 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, но он не делает то, что я хочу.

+2

Что случилось с 'config_value_vec :: iterator'? – avakar

ответ

8

Я думаю, что вы хотите:

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

Следующая редакция C++ стандарта (C++ 0x) позволит вам сделать:

auto it = config.begin(); 
+0

Я просто писал это: P вы попали в пост сначала, я думаю ... –

+0

Aw, извините, чтобы украсть ваш гром :-) –

1

Я думаю, что вы хотите:

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 
} 
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(); 

Конечно, если вы начнете нуждаясь различными типами итераторов для контейнера (сопзИте против неконстантного, назад против вперед, и т.д.), то вы можете в конечном итоге с несколькими итераторами определений типов.

4) Не беспокойтесь об этом, потому что типы контейнеров могут иметь фундаментальные различия, которые вы не сможете решить с помощью простых typedefs. Например, std :: sort может использоваться с std :: vector, но не std :: list. В зависимости от того, что делает ваш код (или, возможно, это нужно сделать в будущем), попытка сохранить его по-настоящему неагрессивным, может занять больше времени, чем это стоит. Но вы должны сами оценить это.

Смежные вопросы