1

次の 2 つの関数を 1 つにマージできるように、コンテナーと 2 つのタプル型にテンプレートを用意したいと考えています。

template<typename Container>
void vblock(int row, int col, const Container& container) {
  foreach( const typename Container::value_type& item, container ) {
    cell(row, col, item);
    ++row;
  }
}

template<typename container, typename T1, typename T2>
void vblock(int row, int col,
          const std::list<typename boost::tuple<T1, T2> >& container) {
  typedef boost::tuple<T1, T2> Tuple;
  foreach( const Tuple& item, container ) {
    cell(row, col, item.template get<0>());
    cell(row + 1, col, item.template get<1>());
    ++col;
  }
}

template<typename container, typename T1, typename T2>
void vblock(int row, int col,
          const std::set<typename boost::tuple<T1, T2> >& container) {
  typedef boost::tuple<T1, T2> Tuple;
  foreach( const Tuple& item, container ) {
    cell(row, col, item.template get<0>());
    cell(row + 1, col, item.template get<1>());
    ++col;
  }
}

C++ Templates - Specifying a container type and that container element type that it has and C++ Template class using STL container and a typedefを既に確認しましたが、私の質問には答えません。

STL コンテナーに適したシンプルな C++ テンプレートという質問は私の質問に最も似ていますが、boost::tuple のテンプレートを追加する方法がわかりませんでした。ありがとう!

4

2 に答える 2

1

単純にする:

template <typename C>
void vblock(int row, int col, C const & container)
{
    typedef typename C::value_type tuple_type;
    typedef typename boost::element<0, tuple_type>::type first_type;
    typedef typename boost::element<1, tuple_type>::type second_type;

    // ...
}

不可能なオーバーロードの作成を防ぐために、関数宣言にロジックを追加することもできますがenable_if、おそらくそれはまだ必要ではありません。

于 2012-08-15T13:39:23.983 に答える
0

Kerrek SBによる解決策は適切であり、一般的なケースに適用できます(私はそれに投票しました)。

結局、私は関数のオーバーロードを使用するわずかに異なる実装に落ち着きました。これは、特にenable_ifを必要とせず、それでもエレガントであるため、可能な代替手段です。

template<typename Container>
void vblock(int row, int col, const Container& container) {
  foreach( const typename Container::value_type& item, container ) {
    vblock_cell_impl(row, col, item);
    ++row;
  }
}

template<typename T>
void vblock_cell_impl(int row, int col, const T& item) {
  cell(row, col, item);
}

template<typename T1, typename T2>
void hblock_cell_impl(int row, int col, const boost::tuple<T1, T2>& item) {
  cell(row, col, item.template get<0>());
  cell(row + 1, col, item.template get<1>());
}
于 2012-08-16T06:13:18.343 に答える