2
boost::filesystem::recursive_directory_iterator end, begin(directory);

auto num_of_files=std::count_if(begin, end, 
        std::not1(boost::filesystem::is_directory)));

上記のディレクトリイテレータの関数is_directoryを無効にしようとしていますが、レンガの壁にぶつかっています。not1asのテンプレートを指定してみましbool(*)(const boost::filesystem::path&)たが、関数を静的にキャストしようとしましたが、どちらも成功しませんでした。

私はlamdbaに頼ることができることを知っていますが、それがうまくいけばこれはよりきれいです。

ありがとう

4

3 に答える 3

6

std::not1引数として関数オブジェクトが必要です。この関数オブジェクトはで取得できるstd::ptr_funため、これは機能するはずです。

auto num_of_files=std::count_if(begin, end, 
        std::not1(std::ptr_fun((bool(*)(const boost::filesystem::path&))boost::filesystem::is_directory)));

(括弧の数はおそらく正しくありません)。is_directoryところで、オーバーロードされた関数であるため、キャストが必要です。

ただし、質問にc ++ 11のタグを付けるため、ラムダを使用できます。

auto num_of_files=std::count_if(begin, end, [](const boost::filesystem::path& p) { return !boost::filesystem::is_directory(p); });
于 2011-09-19T13:06:04.820 に答える
0

not1は、関数ポインターを使用してフィードしようとしているときに、 Adaptable Predicate (つまり、戻り値などのtypedefを使用)である必要があるfunctorクラスのインスタンスを受け入れます。したがって、ファンクターでラップする必要があり、ptr_funが役立つ場合があります。おそらくこれはうまくいくでしょう(名前空間stdを使用すると仮定します;名前空間ブーストを使用します;):

auto num_of_files=count_if(begin, end, not1(ptr_fun(filesystem::is_directory)));
于 2011-09-19T13:07:19.720 に答える
0

ptr_funが必要です、

このかなり手の込んだイラストは13回印刷する必要があります:( http://ideone.com/C5HTRも参照)

#include <functional>
#include <string>
#include <algorithm>
#include <iostream>

bool pred(const std::string& s)
{
    return s.size() % 2;
}

int main()
{
    std::string data[] = { "hello", "world!" };

    std::cout << std::count_if(data, data+2, 
            pred) << std::endl;

    std::cout << std::count_if(data, data+2, 
            std::ptr_fun(pred) ) << std::endl;

    std::cout << std::count_if(data, data+2, 
            std::not1(std::ptr_fun(pred))) << std::endl;

    return 0;
}
于 2011-09-19T13:07:21.590 に答える