13

std::標準コンテナを繰り返し処理する場合、接頭辞を省略して ADL に依存して定義を見つけるのは良い考えだと思いますか? 例:

std::vector<int> vec = get_vec();
// range-based for loop would be preferred here, but just for the sake of example
for (auto it = begin(vec), end = end(vec); it != end; ++it) { /*...*/ }

これを行う、または行わない理由はありますか?

4

2 に答える 2

17

ループを変更せずにコンテナーの種類を変更できるように ADL を使用する場合は、using std::begin; using std::end;. これにより、とのメンバーstdを持つ他の名前空間のコンテナーの関数が確実に検出されますが、その名前空間には空き関数がありません。beginend

namespace my {
    template <typename T>
    struct container {
        // ... stuff
        iterator begin();
        iterator end();
    };
    // no begin/end free functions
}


my::container<int> vec = get_vec();
using std::begin;
using std::end;
for (auto it = begin(vec), end = end(vec); it != end; ++it) { /*...*/ }
// defaults to std::begin which defaults to .begin() member function
于 2012-06-28T10:28:59.670 に答える
8

std:: プレフィックスを省略し、定義を見つけるために ADL に頼るのは良い考えだと思いますか?

いい考えだと思います。次のようなテンプレートで必要になります。

template<typename Container>
void do_work(Container const & c)
{ 
  using std::begin;  //enable ADL
  using std::end;    //enable ADL 

  //now let compiler search the correct begin/end in the initialization part
  for(auto it = begin(c), itend = end(c); it != itend ; ++it)
  {
       //do work
  } 
}

ここでContainerは、たとえば namespace でプログラマーによって定義された型になる可能性があるため、上記の関数テンプレートは、単に(初期化部分で) の代わりxyzに記述した場合、どのように機能しますか?std::beginbegin

于 2012-06-28T10:30:19.827 に答える