ページ 1 / 1
「std::placeholders」の存在意義?
Posted: 2018年8月10日(金) 10:19
by JAST
C++には「std::placeholders」がありますが、
どんな場合使わなければならない(or それを使うほうが良い)のでしょうか。
できれば具体例でお願いします。
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月11日(土) 04:34
by よもやま
JAST さんが書きました: ↑5年前
C++には「std::placeholders」がありますが、
どんな場合使わなければならない(or それを使うほうが良い)のでしょうか。
できれば具体例でお願いします。
既にいくつか調べられたかもしれませんが
使われ方については
【C++】std::bindの使い方
を参考にしてみてください。
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月11日(土) 09:26
by かずま
そこにある
コード:
auto func2 = std::bind(test_function, std::placeholders::_1, 9);
は、次のようにも書いても、同じように func2(1); で呼び出せます。
コード:
auto func2 = [](int x) { test_function(x, 9); };
または、
コード:
struct { void operator()(int x) { test_function(x, 9); } } func2;
std::placeholders がないと困る、
std::placeholders にしかできない、
という例を思いつきません。
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月12日(日) 10:21
by JAST
よもやま さん、 かずま さん
ありがとうございます。
かずま さんの例文はとても勉強になりました。
そうしますと、「マイナー意味しかない」ですね。
意外、意外。。。
placeholderって、有名なLIB「TensorFlow」の重要な仕組みだけに、、、
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月21日(火) 22:29
by Math
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月22日(水) 07:26
by tk-xleader
かずま さんが書きました: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を用いなくても記述することができます。
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月24日(金) 08:17
by composer
ご回答有難うございます
tk-xleader さまが書かれました↓
C++14なら、※行をラムダ式を使って
コード:
std::for_each(arr.begin(), arr.end(), [v = x, &r = x](int _1){r += _1 + v;});
と置き換えることができて、std::bindを用いなくても記述することができます。
これで、C++14において、std::bindの存在がまったく意味がなくなるというでしょうか。どうか。
また宜しくお願いします。
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月24日(金) 20:20
by tk-xleader
composer さんが書きました: ↑5年前
ご回答有難うございます
tk-xleader さまが書かれました↓
C++14なら、※行をラムダ式を使って
コード:
std::for_each(arr.begin(), arr.end(), [v = x, &r = x](int _1){r += _1 + v;});
と置き換えることができて、std::bindを用いなくても記述することができます。
これで、C++14において、std::bindの存在がまったく意味がなくなるというでしょうか。どうか。
また宜しくお願いします。
英語ですが、同じ質問をしている人がいます。
https://stackoverflow.com/questions/173 ... das-in-c14
C++14では、ラムダ式に
初期化式付きキャプチャと
ジェネリック引数が追加され、ラムダ式は関数オブジェクトとほぼ同等の表現力を備えました。std::bindというのは関数オブジェクトを生成して返す関数なので、std::bindで出来ることはラムダ式で表現できるということになります。ですから、理論的にはstd::bindがなくても困らないってことにはなります。
ただ、過去のコードとの互換性維持や、コーダーの好みの問題というのもあるわけですから、std::bindの意味がなくなるとまではいえないでしょう。
Re: 「std::placeholders」の存在意義?
Posted: 2018年8月25日(土) 11:10
by composer
tk-xleader さま
非常に素晴らしいご解説ありがとうございました!