1

aに含まれるすべての整数を にコピーしたいb

#include <vector>
#include <iterator>
#include <boost/bind.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/range/algorithm/copy.hpp>
void test()
{
        std::vector<std::vector<int> > a;
        std::vector<int> b;
        boost::for_each(a, boost::bind(boost::copy, _1, std::back_inserter(b)));
}

とてもシンプルに見えます。C++ 98 互換のワンライナーが欲しいです。

なぜこれはコンパイルされないのですか? に関するエラーの長いリストがありますがboost::bind、理解できません。さらに、それは複数ページの長さです。

エラーは次で始まります:

エラー C2780: 'boost::_bi::bind_t<_bi::dm_result::type,boost::_mfi::dm,_bi::list_av_1::type> boost::bind(MT::* ,A1)' : 2 つの引数が必要です - 3 つ提供されます

4

1 に答える 1

1

ここに直接関連する質問があります:関数テンプレートで (ブースト) バインドを使用できますか? . その質問のエラーメッセージは同じであり、テンプレート関数がライブラリ関数ではないという点で問題が異なります。

ここでの秘訣は、テンプレート関数をバインドしようとしているということですboost::copy<>()。これは、リンクされた質問によると、関数ポインターとして渡すためにテンプレート関数をインスタンス化する必要があるため不可能です。これは、セクション「テンプレート関数のバインド」にも示されています。したがって、残念ながら、かなり長い構成に頼る必要があります。これは、を使用してわずかに短縮できます (C++98 を使用しているため、どちらも使用できません)。typedefdecltype

int main()
{
        typedef std::vector<int> IntVec;
        std::vector<IntVec> a;
        IntVec b;
        boost::for_each(a,
            boost::bind(boost::copy<IntVec,
            std::back_insert_iterator<IntVec> >, _1, std::back_inserter(b)));
}
于 2016-02-24T17:37:01.713 に答える