#6
by tk-xleader » 5年前
かずま さんが書きました:std::placeholders がないと困る、
std::placeholders にしかできない、
という例
C++14以降、std::bindを使わなければならないという場面はないですね。ラムダ式のキャプチャに初期化式をつけることができるようになったのがその理由です。
C++11であれば、ラムダ式で対応できないstd::bindの使い方に、以下のようなものがあります。
コード:
#include<iostream>
#include<algorithm>
#include<functional>
void add(int a, int b, int& c){
c += a + b;
}
int main(){
int x = 0;
std::array<int, 5> arr = {100, 200, 300, 400, 500};
std::for_each(arr.begin(), arr.end(), std::bind(add, std::placeholders::_1, x, std::ref(x))); //※
std::cout << x << std::endl;
}
C++14なら、※行をラムダ式を使って
コード:
std::for_each(arr.begin(), arr.end(), [v = x, &r = x](int _1){r += _1 + v;});
と置き換えることができて、std::bindを用いなくても記述することができます。
[quote="かずま"]std::placeholders がないと困る、
std::placeholders にしかできない、
という例[/quote]
C++14以降、std::bindを使わなければならないという場面はないですね。ラムダ式のキャプチャに初期化式をつけることができるようになったのがその理由です。
C++11であれば、ラムダ式で対応できないstd::bindの使い方に、以下のようなものがあります。
[code=cpp]
#include<iostream>
#include<algorithm>
#include<functional>
void add(int a, int b, int& c){
c += a + b;
}
int main(){
int x = 0;
std::array<int, 5> arr = {100, 200, 300, 400, 500};
std::for_each(arr.begin(), arr.end(), std::bind(add, std::placeholders::_1, x, std::ref(x))); //※
std::cout << x << std::endl;
}
[/code]
C++14なら、※行をラムダ式を使って
[code=cpp]std::for_each(arr.begin(), arr.end(), [v = x, &r = x](int _1){r += _1 + v;});[/code]
と置き換えることができて、std::bindを用いなくても記述することができます。