21

私はこのコードをコンパイルしようとしました:

#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <vector>

int main() {
    std::vector<int> v{
        1,5,4,2,8,5,3,7,9
    };
    std::cout << *boost::min_element(v | boost::adaptors::transformed(
            [](int i) { return -i; })) << std::endl;
    return 0;
}

コンパイルは次のエラーメッセージで失敗しました(長いテンプレートインスタンス化小説の後):

/usr/local/include/boost/iterator/transform_iterator.hpp:84:26: error: use of deleted function ‘main()::<lambda(int)>::<lambda>()’
../main.cpp:12:5: error: a lambda closure type has a deleted default constructor

私は問題をグーグルで検索し、BoostUsersメーリングリストアーカイブでこれを見つけました。#define BOOST_RESULT_OF_USE_DECLTYPE使用することで問題が解決することが示唆されました。コードの最初に配置しましたが、それでもコンパイルされません。エラーメッセージの長さははるかに短いようですが、最後のエラーメッセージは同じです。現在、Boost1.50を使用しています。

ここで何が問題になる可能性がありますか?これを機能させる方法はありますか?

4

4 に答える 4

10

http://smellegantcode.wordpress.com/2011/10/31/linq-to-c-or-something-much-better/

しかし、あなたはこれを使うことができます、それはうまくいきます。

#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <vector>
#include <functional>

int main() {
    std::vector<int> v{
        1,5,4,2,8,5,3,7,9
    };
    std::function<int(int)> func = [](int i) { return -i; };
    std::cout << *boost::min_element(v | boost::adaptors::transformed(
    func)) << std::endl;
    return 0;
}

http://liveworkspace.org/code/b78b3f7d05049515ac207e0c12054c70

#define BOOST_RESULT_OF_USE_DECLTYPEたとえば、VS2012では正常に動作します。

于 2012-08-08T20:38:24.427 に答える
10

キャプチャしないラムダの前に「+」を付けると、ラムダを関数ポインタに変えることができます。

std::vector<int> v{1,5,4,2,8,5,3,7,9};
std::cout << *boost::min_element(v | 
    boost::adaptors::transformed(+[](int i) 
    {
        return -i; 
    })) << std::endl;
于 2015-05-08T21:33:53.637 に答える
6

これについては、http://boost.2283326.n4.nabble.com/range-cannot-use-lambda-predicate-in-adaptor-with-certain-algorithms-td3560157.htmlおよびhttps://svn.boostで説明れています。 org / trac / boost / ticket / 4189-問題は、一部のアルゴリズムが述語をコピー構築(およびデフォルト構築、コピー割り当て)できることを期待していることです。これはラムダでは実行できません。

std::function回避策は、ラムダを:でラップすることです。

*boost::min_element(
    v | boost::adaptors::transformed(std::function<int(int)>(
        [](int i) { return -i; })));

私は(ラムダの呼び出しシグネチャまたは「make_function」の任意の呼び出し可能オブジェクトを推測する際に)、次のように書くmake_functionことができるようなものを書く方法を尋ねました。

*boost::min_element(
    v | boost::adaptors::transformed(make_function(
        [](int i) { return -i; })));
于 2012-08-09T21:05:08.110 に答える
0

C ++ 17フィーチャクラステンプレートの引数の推定を使用すると、次のようにstd ::functionsimplierでラップできます。

*boost::min_element(
    v | boost::adaptors::transformed(std::function(
        [](int i) { return -i; })));
于 2018-07-30T16:16:00.117 に答える