「std::placeholders」の存在意義?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JAST

「std::placeholders」の存在意義?

#1

投稿記事 by JAST » 5年前

C++には「std::placeholders」がありますが、
どんな場合使わなければならない(or それを使うほうが良い)のでしょうか。
できれば具体例でお願いします。

よもやま
記事: 68
登録日時: 8年前
連絡を取る:

Re: 「std::placeholders」の存在意義?

#2

投稿記事 by よもやま » 5年前

JAST さんが書きました:
5年前
C++には「std::placeholders」がありますが、
どんな場合使わなければならない(or それを使うほうが良い)のでしょうか。
できれば具体例でお願いします。
既にいくつか調べられたかもしれませんが
使われ方については
【C++】std::bindの使い方
を参考にしてみてください。

かずま

Re: 「std::placeholders」の存在意義?

#3

投稿記事 by かずま » 5年前

よもやま さんが書きました:
5年前
使われ方については
【C++】std::bindの使い方
を参考にしてみてください。
そこにある

コード:

    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 にしかできない、
という例を思いつきません。

JAST

Re: 「std::placeholders」の存在意義?

#4

投稿記事 by JAST » 5年前

よもやま さん、 かずま さん
ありがとうございます。

かずま さんの例文はとても勉強になりました。

そうしますと、「マイナー意味しかない」ですね。
意外、意外。。。

placeholderって、有名なLIB「TensorFlow」の重要な仕組みだけに、、、

Math

Re: 「std::placeholders」の存在意義?

#5

投稿記事 by Math » 5年前

要は、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

アバター
tk-xleader
記事: 158
登録日時: 13年前
連絡を取る:

Re: 「std::placeholders」の存在意義?

#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を用いなくても記述することができます。

composer

Re: 「std::placeholders」の存在意義?

#7

投稿記事 by 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の存在がまったく意味がなくなるというでしょうか。どうか。

また宜しくお願いします。

アバター
tk-xleader
記事: 158
登録日時: 13年前
連絡を取る:

Re: 「std::placeholders」の存在意義?

#8

投稿記事 by tk-xleader » 5年前

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の意味がなくなるとまではいえないでしょう。

composer

Re: 「std::placeholders」の存在意義?

#9

投稿記事 by composer » 5年前

tk-xleader さま

非常に素晴らしいご解説ありがとうございました!

返信

“C言語何でも質問掲示板” へ戻る