как правильно написать этот код? - PullRequest
0 голосов
/ 25 августа 2009
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 :: iterator, но я хочу сделать это независимо от типа, поэтому, если я когда-либо изменю вектор на список, мне не придется возвращаться и обновлять код. Это возможно? Благодаря.

Я знаю, что typeof не является реальным ключевым словом, и я знаю о typeid, но он не делает то, что я хочу.

Ответы [ 3 ]

8 голосов
/ 25 августа 2009

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

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

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

auto it = config.begin();
1 голос
/ 26 августа 2009

Вы можете сделать одну из четырех вещей:

1) Используйте готовое ключевое слово auto, как уже отвечено.

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

Конечно, если вы начинаете нуждаться в разных типах итераторов для контейнера (const против non-const, backward vs forward и т. Д.), То вы можете получить несколько итераторов typedef.

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

1 голос
/ 25 августа 2009

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

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
}
...