1

「T」がキューまたはスタックのいずれかになる関数があります。現在、私が持っている関数の署名について:

template <class T>
void foo(T<string> baa){

  //do something
}

foo 内で T.pop() を呼び出したいのですが、できません。

次に、2 つのバージョンの pop を作成しました。1 つはキュー用で、もう 1 つはスタック用です。

string bar(stack<string> & baa){
  string t=baa.top();
  baa.pop();
  return t;
}
string bar(queue<string> & baa){
  string t=baa.front();
  baa.pop();
  return t;
}

その後、これを実行しようとしましたが、うまくいきませんでした。どうすればいいですか?

template <class T>
void foo(T<string> baa){
  //do something
  string baz=bar(baa);
}

編集: top() は単純に一番上の要素を削除することを忘れていました。これらの変更を反映するようにコード フラグメントを編集しました。ただし、まだ機能していません。

4

1 に答える 1

2

本当にこのようなことをしたいのであれば、構文的に必要なのはテンプレートテンプレートパラメータです:

template<template<typename> class T>
void foo(T<string>& baa)
{
    ...
}

ただし、テンプレート テンプレート パラメーターのテンプレート パラメーターは、テンプレート テンプレート引数 のパラメーターTと正確に一致する必要があることに注意してください。これらのパラメーターには既定の引数値があります。

つまり、STLstackqueueコンテナー アダプターは2 つの型パラメーターを受け入れるため (2 番目のパラメーターには既定の引数値がありますが)、それらを関数 template のテンプレート テンプレート引数として推定する場合foo()、テンプレート テンプレート パラメーターは2 つTを取る必要があります。型パラメータ:

template<template<typename, typename> class T, typename C>
void foo(T<string, C>& baa)
{
    ...
}

ただし、現在のニーズではそのような設計は必要ないように思われることを指摘しておきます。これで十分です:

template<typename T>
string bar(T& baa)
{
    string t = baa.front();
    baa.pop();
    return t;
}

非コンテナー型で動作する必要がある他の関数テンプレートオーバーロードがある場合にのみ、テンプレート テンプレート パラメーターを使用してソリューションを採用することを余儀なくされますがbar()、これはあなたのケースではないようです。

于 2013-01-27T20:34:43.800 に答える