[英]Does std::bind discard type information of parameters in C++11?
[英]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.