C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で関数とプレースホルダーをバインドする


ここでは、C++のBind関数とプレースホルダーを確認します。必要に応じて、一部の機能の操作を操作する必要がある場合があります。いくつかのデフォルトパラメータを使用して、操作の本質を得ることができます。

C ++ 11では、バインド関数と呼ばれる1つの新機能が導入されています。これは、このような操作をより簡単な方法で行うのに役立ちます。これらの機能を使用するには、ヘッダーファイルを使用する必要があります。

プレースホルダーを使用して関数をバインドすると、目的の出力に応じて関数を変更するための位置と引数の数を決定するのに役立ちます。

プレースホルダーは、関数内の値の位置を検出する名前空間です。プレースホルダーは、_1、_2、_3などで表されます。

#include <functional>
#include <iostream>
struct Foo {
   Foo(int num) : num_(num) {}
   void print_add(int i) const { std::cout << num_+i << '\n'; }
   int num_;
};
void print_num(int i) {
   std::cout << i << '\n';
}
struct PrintNum {
   void operator()(int i) const {
      std::cout << i << '\n';
   }
};
int main() {
   std::function<void(int)> f_display = print_num;
   f_display(-9);
   std::function<void()> f_display_42 = []() { print_num(42); };
   f_display_42();
   std::function<void()> f_display_31337 = std::bind(print_num, 31337);
   f_display_31337();
   std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
   const Foo foo(314159);
   f_add_display(foo, 1);
   std::function<int(Foo const&)> f_num = &Foo::num_;
   std::cout << "num_: " << f_num(foo) << '\n';
   using std::placeholders::_1;
   std::function<void(int)> f_add_display2= std::bind( &Foo::print_add, foo, _1 );
   f_add_display2(2);
   std::function<void(int)> f_add_display3= std::bind( &Foo::print_add, &foo, _1 );
   f_add_display3(3);
   std::function<void(int)> f_display_obj = PrintNum();
   f_display_obj(18);
}

出力

-9
42
31337
314160
num_: 314159
314161
314162
18

  1. C++でのフレンドクラスと関数

    クラスのフレンド関数はそのクラスのスコープ外で定義されていますが、クラスのすべてのプライベートメンバーと保護されたメンバーにアクセスする権利があります。フレンド関数のプロトタイプはクラス定義に表示されますが、フレンドはメンバー関数ではありません。 フレンドは、関数、関数テンプレート、メンバー関数、またはクラスまたはクラステンプレートにすることができます。この場合、クラス全体とそのすべてのメンバーがフレンドになります。 関数をクラスのフレンドとして宣言するには、次のように、クラス定義の関数プロトタイプの前にキーワードfriendを付けます- class Box { double width;

  2. C++でのendlと\nの比較

    \ n改行を出力します(適切なプラットフォーム固有の表現であるため、Windowsでは \ r \ nを生成します)が、std::endlは同じで、ストリームをフラッシュします。通常、ストリームをすぐにフラッシュする必要はなく、パフォーマンスが低下するだけなので、ほとんどの場合、std::endlを使用する理由はありません。 ストリームを手動でフラッシュする場合-例:出力がタイムリーにユーザーに表示されることを期待しているためです。ストリームに「\n」を書き込む代わりに、std ::endlを使用する必要があります(分離された文字または文字列の一部として)。