编写此代码的正确方法是什么?

时间:2009-08-25 19:03:50

标签: c++ stl boost vector iterator

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的boost指针数组。我知道我可以将iterator指定为std :: vector&lt; config_value_ptr&gt; :: iterator但我想以类型无关的方式执行此操作,因此如果我将向量更改为列表,则无需返回并更新代码。那可能吗?感谢。

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

3 个答案:

答案 0 :(得分:8)

我想你想要:

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

下一版的C ++标准(C ++ 0x)允许您这样做:

auto it = config.begin();

答案 1 :(得分: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
}

答案 2 :(得分:1)

你可以做以下四件事之一:

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 vs non-const,backward vs forward等),那么你最终可能会得到几个iterator typedef。

4)不要理会它,因为容器类型可能存在根本差异,您可能无法使用简单的typedef解决这些差异。例如,std :: sort可以与std :: vector一起使用,但不能与std :: list一起使用。根据您的代码执行的操作(或将来可能需要执行的操作),尝试保持其真正的类型不可知可能需要花费更多时间而不是它的价值。但你必须自己评估一下。