2

免責事項:私はこの質問decltypeを見てきましたが、受け入れられた回答で提案されている をそのためにどのように使用できるかを正確に尋ねています。

基本的に、コンテナ全体に適用したときに使用を簡素化する標準アルゴリズム用の小さなラッパーを実装することを試みます (少しは楽しみ、少しは便利、そして少しは学習目的)。主なアイデアは、アルゴリズムを適用する必要があるコンテナを取り除き.begin()、単に指定することです。.end()

次に、標準アルゴリズムの戻り値の型自体からラッパーの戻り値の型を推測することが可能かどうか (ちなみに愚かではない) を知りたいです。

とりあえず、次のことを試しました(std::countの場合):

template<class Cnt,
         class T>
inline 
auto count(Cnt _cnt, const T& _val) -> decltype(std::count){}

しかし、コンパイル時にエラーが発生しました:

関数テンプレート ''unknown-type' ragut::count(Cnt,const T &)' の特殊化に失敗しました

と言うだけでは不十分かもしれないと考えdecltype(std::count)、次のようなより具体的な引数を要求したと仮定しました。

decltype(std::count<std::iterator<std::input_iterator_tag,Cnt::value_type> >)

しかし、これは同じエラーを出しました。

それが実際に愚かではなく、それが可能かどうかを知りたいです。

4

2 に答える 2

5

decltype(x)式のタイプを示しますx。つまり、関数テンプレート (最初のケース) または関数 (2 番目のケース) を返す関数を作成しようとしています。それはうまくいきません。次のように、への呼び出しのタイプが必要ですstd::count

template<class Cnt,
         class T>
inline 
auto count(Cnt _cnt, const T& _val) 
  -> decltype(std::count(std::begin(_cnt), std::end(_cnt), _val)))
{ }
于 2013-10-09T07:54:30.823 に答える
1

正しいテンプレート引数を指定すると機能します。この場合、それらは<typename Cnt::const_iterator, typename Cnt::value_type>

于 2013-10-09T07:54:13.100 に答える