2009-08-25 73 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(); 

我想提取一个迭代器到boost_ pointers类的数组config_value_c。我知道我可以指定迭代器为std :: vector <config_value_ptr> :: iterator,但我想以类型无关的方式来做到这一点,所以如果我将矢量更改为列表,我不必返回并更新代码。那可能吗?谢谢。写这段代码的正确方法是什么?

我知道typeof不是一个真正的关键字,我知道typeid,但它不会做我想要的。

+2

'config_value_vec :: iterator'有什么问题? – avakar 2009-08-25 19:06:32

回答

8

我想你想:

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

C++标准(C++ 0x中)将允许下一版的你做:

auto it = config.begin(); 
+0

我只是写这个:P你先打我的帖子后,我猜... – 2009-08-25 19:09:03

+0

噢,对不起,以窃取你的雷霆:-) – 2009-08-25 21:11:57

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

当然,如果你开始需要不同类型的迭代器容器(常量VS非const,落后VS向前,等等),那么你可以用几个迭代的typedef结束。

4)不要打扰它,因为容器类型可能有根本的区别,你可能无法用简单的typedef解决。例如,std :: sort可以与std :: vector一起使用,但不能用于std :: list。根据你的代码的作用(或将来可能需要做的),试图使它保持真正的类型不可知性可能需要更多的时间而不是它的价值。但是你必须自己评估一下。

相关问题