1

要素のベクトルを取り、それに対していくつかの操作のシーケンスを実行するテンプレート関数を作成しています。これらの操作の 1 つが std::sort() です。

当然、クライアント コードはコンパレータ ファンクタを提供する必要があります。既知の型 (int、string など) のコンテナーを渡す場合、クライアント コードでこのパラメーターの値を指定したくありません。Comp テンプレート パラメータのデフォルト値はどのように定義すればよいですか?

template<typename Container, typename Comp=????>
void my_func(Container elements, Comp comp) {
  ...
  std::sort(elements.begin(), elements.end(), comp);
  ...
}
4

4 に答える 4

2

std::sort はデフォルトのコンパレータとして "Less" を使用します。したがって、一貫性を保つには:

template<typename Container, typename Comp = std::less<typename Container::value_type> >
void my_func(Container& elements, Comp comp = Comp())
{
  std::sort(elements.begin(), elements.end(), comp);
}
于 2013-07-13T05:38:56.367 に答える
0
#include <vector>
#include <algorithm>

template<typename Container, typename Comp=std::less<typename Container::value_type>>
void my_func(Container elements, Comp comp = Comp()) {
  //...
  std::sort(elements.begin(), elements.end(), comp);
  //...
}

int main() {
    std::vector<int> v;
    my_func(v);
}

また注意してくださいComp comp = Comp()

于 2013-07-13T05:37:23.510 に答える
0

テンプレート自体をデフォルトにするのではなく、関数のパラメーターをstd::greateror std::lessfor >and<それぞれに似たものにします。std::sortデフォルトで使用std::lessします。

そのためのテンプレート パラメーターを取得する場合は、C++14 で実際に受け入れられたN3421std::greater<>と呼ばれる一般化された型で動作するようにする提案があります。

ただし、それまではできますstd::greater<typename Container::value_type>。必要に応じて、type_traits を使用して参照または cv 修飾子を削除することもできます。

<functional>には他にもデフォルトの比較がありますが、これらの 2 つが最も一般的です。

したがって、「完全な」ソリューションは次のようになります。

template<typename Container, typename Comp>
void my_func(Container& elements, Comp comp = std::less<typename Container::value_type>()) {
  std::sort(elements.begin(), elements.end(), comp);
}
于 2013-07-13T05:37:25.603 に答える
0

あなたの例には2つの問題があります:

  1. デフォルトの動作を行うには、ファンクターとして提供する必要がありますless<T>

  2. 関数はコピーを取得しているため、代わりに参照を取得しない限り、コピーはソートされますContainer

これを作成する方法の例:

#include <functional>
template<typename Container, typename Comp=std::less<typename Container::value_type> >
void my_func(Container &elements, Comp comp = Comp() )
{
  std::sort(elements.begin(), elements.end(), comp);
}
// A partial specialisation for std::list
#include <list>
template<typename ContainerValueType, typename Allocator, typename Comp=std::less<ContainerValueType> >
void my_func(std::list<ContainerValueType, Allocator> &elements, Comp comp = Comp() )
{
  elements.sort(comp);
}
于 2013-07-13T05:41:36.863 に答える