【问题标题】:what's the correct way of writing this code?编写此代码的正确方法是什么?
【发布时间】:2010-11-22 18:03:39
【问题描述】:
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 指针数组。我知道我可以将迭代器指定为 std::vector::iterator 但我想以与类型无关的方式执行此操作,因此如果我将向量更改为列表,我不必返回并更新代码。那可能吗?谢谢。

我知道 typeof 不是一个真正的关键字,并且我知道 typeid 但它不能满足我的要求。

【问题讨论】:

  • config_value_vec::iterator 有什么问题?

标签: c++ stl boost vector iterator


【解决方案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 与非 const,向后与向前等),那么您最终可能会得到多个迭代器 typedef。

4) 不要为此烦恼,因为容器类型可能存在根本差异,您可能无法使用简单的 typedef 来解决这些差异。例如,std::sort 可以与 std::vector 一起使用,但不能与 std::list 一起使用。根据您的代码所做的事情(或将来可能需要做的事情),尝试使其真正与类型无关可能需要更多的时间而不值得。但你必须自己评估。

【讨论】:

    【解决方案2】:

    我想你想要这个:

    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
    }
    

    【讨论】:

      【解决方案3】:

      我想你想要:

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

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

      auto it = config.begin();
      

      【讨论】:

      • 噢,对不起,抢了你的风头 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多