C++には「std::placeholders」がありますが、
どんな場合使わなければならない(or それを使うほうが良い)のでしょうか。
できれば具体例でお願いします。
「std::placeholders」の存在意義?
Re: 「std::placeholders」の存在意義?
既にいくつか調べられたかもしれませんがJAST さんが書きました: ↑5年前C++には「std::placeholders」がありますが、
どんな場合使わなければならない(or それを使うほうが良い)のでしょうか。
できれば具体例でお願いします。
使われ方については
【C++】std::bindの使い方
を参考にしてみてください。
Re: 「std::placeholders」の存在意義?
そこにある は、次のようにも書いても、同じように func2(1); で呼び出せます。 または、 std::placeholders がないと困る、
std::placeholders にしかできない、
という例を思いつきません。
Re: 「std::placeholders」の存在意義?
よもやま さん、 かずま さん
ありがとうございます。
かずま さんの例文はとても勉強になりました。
そうしますと、「マイナー意味しかない」ですね。
意外、意外。。。
placeholderって、有名なLIB「TensorFlow」の重要な仕組みだけに、、、
ありがとうございます。
かずま さんの例文はとても勉強になりました。
そうしますと、「マイナー意味しかない」ですね。
意外、意外。。。
placeholderって、有名なLIB「TensorFlow」の重要な仕組みだけに、、、
Re: 「std::placeholders」の存在意義?
要は、function(関数ポインタ/関数オブジェクト/ラムダ式)の引数を束縛して新しいfunctionオブジェクトを生成してる。
http://d.hatena.ne.jp/joynote/20100723/1279868031
Nは10以上が推奨されてるようです。( C++11 )
https://cpprefjp.github.io/reference/fu ... lders.html
C++17以降は変わるようです。
http://www2.koyoen.birdview.co.jp/~abcxyz/z0821c.png
http://marycore.jp/prog/cpp/std-bind/
用途としてはいろんなサイトにある。
http://kaworu.jpn.org/cpp/std::bind
http://d.hatena.ne.jp/joynote/20100723/1279868031
Nは10以上が推奨されてるようです。( C++11 )
https://cpprefjp.github.io/reference/fu ... lders.html
C++17以降は変わるようです。
http://www2.koyoen.birdview.co.jp/~abcxyz/z0821c.png
http://marycore.jp/prog/cpp/std-bind/
用途としてはいろんなサイトにある。
http://kaworu.jpn.org/cpp/std::bind
- tk-xleader
- 記事: 158
- 登録日時: 13年前
- 連絡を取る:
Re: 「std::placeholders」の存在意義?
C++14以降、std::bindを使わなければならないという場面はないですね。ラムダ式のキャプチャに初期化式をつけることができるようになったのがその理由です。かずま さんが書きました:std::placeholders がないと困る、
std::placeholders にしかできない、
という例
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;
}
- tk-xleader
- 記事: 158
- 登録日時: 13年前
- 連絡を取る:
Re: 「std::placeholders」の存在意義?
英語ですが、同じ質問をしている人がいます。composer さんが書きました: ↑5年前ご回答有難うございます
tk-xleader さまが書かれました↓これで、C++14において、std::bindの存在がまったく意味がなくなるというでしょうか。どうか。
また宜しくお願いします。
https://stackoverflow.com/questions/173 ... das-in-c14
C++14では、ラムダ式に初期化式付きキャプチャとジェネリック引数が追加され、ラムダ式は関数オブジェクトとほぼ同等の表現力を備えました。std::bindというのは関数オブジェクトを生成して返す関数なので、std::bindで出来ることはラムダ式で表現できるということになります。ですから、理論的にはstd::bindがなくても困らないってことにはなります。
ただ、過去のコードとの互換性維持や、コーダーの好みの問題というのもあるわけですから、std::bindの意味がなくなるとまではいえないでしょう。