我想使用binary_function
在compose2
在C + + 11與std::bind
而不使用boost
庫。如何使用std :: bind與compose2?
編輯:或labmdas。
假設我有以下定義:
bool GreaterThanFive(int x) { return x > 5; }
struct DivisibleByN : binary_function<int, int, bool> {
bool operator()(int x, int n) const { return x % n == 0; }
};
說我要算其中大於5和被3整除一個向量的元素,我可以很容易地用下面結合他們:
int NumBothCriteria(std::vector<int> v) {
return std::count_if(v.begin(), v.end(),
__gnu_cxx::compose2(std::logical_and<bool>(),
std::bind2nd(DivisibleByN(), 3),
std::ref(GreaterThanFive)));
}
由於bind2nd
從C++ 11開始已棄用,我想轉移到std::bind
。我還沒有弄清楚爲什麼以下不等價(並且不能編譯)。
int NumBothCriteria(std::vector<int> v) {
using namespace std::placeholders;
return std::count_if(v.begin(), v.end(),
__gnu_cxx::compose2(std::logical_and<bool>(),
std::bind(DivisibleByN(), _1, 3),
std::ref(GreaterThanFive)));
}
它給了我下面的編譯錯誤:
no type named 'argument_type' in 'std::_Bind<DivisibleByN *(std::_Placeholder<1>, int)>`
operator()(const typename _Operation2::argument_type& __x) const
~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
我的直覺是,std::bind
沒有做的事情做std::bind2nd
,但我不知道如何讓argument_type
的typedef回來。
My search came up with three questions.第一次使用bind2nd
,第二次使用boost
,第三次使用C++ 03。不幸的是有效的STL仍然使用std::bind2nd
。
不'的std :: bind'支撐組分自身,所以如果你用'的std :: bind'取代'__gnu_cxx :: compose2'這應該工作? –
@PiotrSkotnicki是的,你可以。不知道爲什麼我最初回復你說你不能。 – Barry