簡體   English   中英

C ++ 11:將std :: sort綁定為用戶定義的類型,然后將該綁定用作ctor中的參數

[英]C++11: bind std::sort for user-defined type and then use that bind as an argument in ctor

這很復雜 我想創建一個可以容納排序算法的類(主要是比較它們的工作方式)。 要排序的數組的類型為: std::vector<std::shared_ptr<Item>> 我將使用不同的函數對其進行排序,我已經使用類似bool compare_func(std::shared_ptr<Item> const& a, std::shared_ptr<Item> const& b)的函數測試了std::sort()工作正常

算法類還包含其他數據,例如要排序的項目的名稱(std :: string)和數量(int)

當我要創建算法類型的對象並將其放入std::vector<std::shared_ptr<Algorithm>>時,問題就開始了

我已經在SO上發現std :: bind不是對象,所以首先我需要創建如下內容:

struct std_sort {
    template <typename RndIt, typename Cmp>
    void operator()(RndIt begin, RndIt end, Cmp cmp) {
        std::sort(begin, end, cmp);
    }
};

當我嘗試添加類型算法的對象時,問題開始了

vect.push_back(std::make_shared<Algorithm>(std::string("std::sort()"), zero, zero, amount,
        std::bind
        (
            static_cast<void(*)
            (
                std::shared_ptr<Item> a,
                std::shared_ptr<Item> b,
                std::function
                <bool(
                        std::shared_ptr<Item> const& c, std::shared_ptr<Item> const& d
                )>
            )>
            (std_sort()), //error on this line
            std::placeholders::_1, std::placeholders::_2, std::placeholders::_3
        )
    ));

計划是調用此向量的算法對gievn數組進行排序,看起來像vect[0](array.begin(), array.end(), compare_func);

除最后一個參數外,其他所有參數都運行良好,期望的參數為以下類型:

typedef std::function
    <void(
            std::shared_ptr<Item> a,
            std::shared_ptr<Item> b,
            std::function
            <bool(
                std::shared_ptr<Item> const& c, std::shared_ptr<Item> const& d
            )>
    )>
    sorting_function;

我收到的錯誤(來自MinGW)

error: invalid static_cast from type 'std_sort' to type 'void (*)(std::shared_ptr<Item>, std::shared_ptr<Item>, std::function<bool(const std::shared_ptr<Item>&, const std::shared_ptr<Item>&)>)'

如果刪除static_cast,我會收到大量典型的模板錯誤

首先,此調用:

vect[0](array.begin(), array.end(), compare_func);

正在給vect[0]提供迭代器 ,但需要一個實際實例。 您應該將sorting_function的類型更改為:

typedef std::function
    <void(
            std::vector<std::shared_ptr<Item>>::iterator a,
            std::vector<std::shared_ptr<Item>>::iterator b,
            std::function
            <bool(
                std::shared_ptr<Item> const& c, std::shared_ptr<Item> const& d
            )>
    )>
    sorting_function;

其次,您不能直接綁定到該結構,因為它不是函數。 std_sort::operator() 一個函數。 但是由於它是模板,因此設置起來會有些復雜:

std_sort inst();
auto fn = std::bind(
    &std_sort::operator()<const std::shared_ptr<Item>&,
                          std::less<std::shared_ptr<Item>>>,
    &inst, _1, _2);

雖然,似乎最好直接創建一個std::function實例,然后綁定到該實例。

sorting_function fn(std_sort());
vect.push_back(std::make_shared<Algorithm>(..., std::bind(fn, ...)));

甚至更好,只需使用lambda:

vect.push_back(std::make_shared<Algorithm>(...,
    [](std::vector<std::shared_ptr<Item>>::iterator first,
       std::vector<std::shared_ptr<Item>>::iterator last,
       std::function
            <bool(
                std::shared_ptr<Item> const& c, std::shared_ptr<Item> const& d
            )> compare_func) {
        std_sort()(first, last, compare_func);
    }));

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM