2

実装の一部としてキューを使用する関数を作成することに興味がありますが、テンプレート化されたキューのタイプに基づいて異なる機能を持つように、キューのタイプでテンプレート化したいと考えています。

基本的な例を次に示します。

template <typename Queue>
void example()
{
  Queue a;
  a.push(3);
  a.push(1);
  a.push(2);
  while (!a.empty()) {
    cout << a.top() << ' ';
    a.pop();
  }
  cout << flush;
}

私が欲しいのは、example<stack<int>>()印刷すること2 1 3example<priority_queue<int>>()印刷すること3 2 1example<queue<int>>()印刷すること3 1 2です。これはstackandに対して機能しますpriority_queueが、残念ながらqueue提供されずtop、代わりに提供されますfront。代わりにtoptoqueueを呼び出すときにコンパイラに通知する簡単な方法はありますか?front

これを回避する唯一の方法は、この質問How to implement generic method for STL containers that have`t common interface needed for that method using template template parametertopに従い、データ型ごとに独自のローカルを実装することです。代わりにそれを呼び出します。ただし、このソリューションは非常に洗練されていないように思えます。可能であれば、別の方法を見つけたいと思います。

編集:正確にはC++ 11、gcc 4.7.0をサポートするコンパイラを使用しています。

4

1 に答える 1

7

top()aと aメンバーの存在が相互に排他的であると仮定すると、それぞれのメンバーの存在でオーバーロードされる適切なヘルパー関数をfront()作成できます。top()

 template <typename Queue>
 auto top(Queue const& queue) -> decltype((queue.top()))
 {
     return queue.top();
 }

 template <typename Queue>
 auto top(Queue const& queue) -> decltype((queue.front()))
 {
     return queue.front();
 }

top(a)top が呼び出された場合でも、 を使用して現在の top にアクセスできますfront()。ただし、キューにfront()との両方がある場合、これは機能しませんtop()。この問題の簡単な修正方法は、front()バージョンの選択を呼び出しにくいものにすることです。これにより、それが唯一のバージョンである場合は呼び出されますが、 と の両方が使用可能な場合は呼び出されませtop()front()。例えば:

 template <typename Queue>
 auto top(Queue const& queue, bool) -> decltype((queue.top()))
 {
     return queue.top();
 }

 template <typename Queue>
 auto top(Queue const& queue, int) -> decltype((queue.front()))
 {
     return queue.front();
 }

...そして、を使用して最上位の要素にアクセスしますtop(a, true)

于 2013-09-14T02:41:25.780 に答える