std :: functionおよびstd :: bindでC ++テンプレートを使用する

そして

関数のラッパーを生成するテンプレートクラスを作成しようとしています。その後、クラスは結果としてラッパーを返します。テンプレートを使用して、次のような異なるシグネチャを持つ任意の関数で機能する一般的なクラスを作成したいと思います。

  1. std::function<void()>task = std::bind(fun1, param1, param2);
  2. std::function<int(int, int)>task = std::bind(fun2, param1, param2);

私はこのようなものが欲しいです:

template <typename T1, typename T2>
class A {
  A (string param1, string param2) {
    // The created wrapper here i.e. 'task' will be returned by the class.
    function<T1>task = bind(T2, param1, param2);
  }

  // Return the created wrapper in the constructor.
  function<T1> returnWrapper() {
    return task;
  }
};

上記のコードはコンパイルできないため、ほとんどが擬似コードですが、私が探しているものについてのアイデアを提供します。これに対する解決策はありますか?関数のシグネチャにテンプレートを使用するだけでは不十分だと思います。どんな助けでも大歓迎です。また、可能であれば、任意の数のパラメーターを「バインド」に渡すことができるようにしたいと思います。

そして

私は問題を解決したと思います!テンプレート内で2つの型名を取り、そのうちの1つをカリー化後に関数シグネチャとしてstd :: functionに渡し、コンストラクターで2番目の型名を使用して、カリー化された関数(ラップ後の結果関数)をstdで定義するクラスを定義する必要がありました。 ::練る。その後、すべてが正常に機能しました!より良い解決策があるかもしれませんが、これは私が得た最良で多かれ少なかれ明確な解決策でした。これが私が見つけた解決策のスニペットです!それが同じ問題で他の人を助けることを願っています:

#include <iostream>
#include <functional>

using namespace std;

class A {
  private:
    template <typename T1, typename T2>
    class B { 
      private:
        function<T1>ff;

      public:
        B(T2 fun) {
          ff = bind(fun, 1, placeholders::_1);
        }

        virtual ~B() {
        }

        int exec(int x) {
          return ff(x);
        }
    };

    static int myFun(int x, int y) {
      return x + y;
    }

  public:
    A() { 
    };

    int test() {
      B<int(int), int (*)(int, int)> b(&myFun);
      return b.exec(10);
    }

    virtual ~A() {
    };
};

int main() {
  A a;

  // Correct result is '11' since we pass 11 and 1 is in the curried function.
  cout << "test result: " << a.test() << endl;

  return 0;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: bindをstd :: functionおよびstd :: mapと一緒に使用する方法

分類Dev

std :: bindおよびstd :: placeholdersを使用する可変個引数テンプレートファクトリ

分類Dev

C ++ 11:継承でstd :: mem_fnおよびstd :: bindを使用する方法

分類Dev

std :: bindおよびstd :: function with polymorphism、base class

分類Dev

std :: bindおよび関数テンプレート

分類Dev

std :: functionおよびstd :: bind:それらは何であり、いつ使用する必要がありますか?

分類Dev

テンプレートでstd :: functionを使用する

分類Dev

テンプレート引数でstd :: functionを使用する方法

分類Dev

std :: bindおよびstd :: functionを使用すると、コールバックが失敗します

分類Dev

std :: bindとメンバー関数およびこれはc ++で

分類Dev

std :: sscanfおよびstd :: stringを使用するC ++

分類Dev

可変個引数テンプレートを使用したstd :: ref()およびstd :: bind()について少しぼんやりしています

分類Dev

std :: functionおよびstd :: bindの戻り値

分類Dev

パラメータを使用したvoidメソッドをstd :: functionおよびstd :: bind C ++を使用した別のメソッドに渡す

分類Dev

std :: bindがstd :: filesystem :: pathおよびstd :: ostreamで機能しないのはなぜですか?

分類Dev

std :: bindおよびstd :: weak_ptr

分類Dev

オブジェクトのメソッドを使用して、std :: bindおよびstd :: function.targetでCスタイルの関数アドレスを呼び出します

分類Dev

clang-6および-std = c ++ 17-bind(2)を呼び出せません

分類Dev

std :: enable_ifおよびstd :: decayを使用したc ++クラスコンストラクタテンプレート

分類Dev

テンプレート関数パラメーターでstd :: bindを使用する

分類Dev

テンプレート関数をstd :: bindする方法は?

分類Dev

std :: bindでテンプレート関数パラメータを使用する方法は?

分類Dev

テンプレート引数の推定/置換がstd :: tupleおよびテンプレート派生クラスで失敗するのはなぜですか?

分類Dev

constクラスオブジェクトをstd :: functionおよびstd :: bindに渡すとコンパイルエラーが発生します

分類Dev

std :: function、リテラルタイプおよびテンプレート

分類Dev

テンプレートデータでstd :: move()を安全に使用する方法

分類Dev

可変個引数テンプレート、型推定、およびstd :: function

分類Dev

C ++でstd :: threadを一時停止および再開するstd :: condition_variableと比較してstd :: atomicを使用するアプローチ

分類Dev

std :: bindと可変個引数テンプレートおよび自動戻り値の型

Related 関連記事

  1. 1

    std :: bindをstd :: functionおよびstd :: mapと一緒に使用する方法

  2. 2

    std :: bindおよびstd :: placeholdersを使用する可変個引数テンプレートファクトリ

  3. 3

    C ++ 11:継承でstd :: mem_fnおよびstd :: bindを使用する方法

  4. 4

    std :: bindおよびstd :: function with polymorphism、base class

  5. 5

    std :: bindおよび関数テンプレート

  6. 6

    std :: functionおよびstd :: bind:それらは何であり、いつ使用する必要がありますか?

  7. 7

    テンプレートでstd :: functionを使用する

  8. 8

    テンプレート引数でstd :: functionを使用する方法

  9. 9

    std :: bindおよびstd :: functionを使用すると、コールバックが失敗します

  10. 10

    std :: bindとメンバー関数およびこれはc ++で

  11. 11

    std :: sscanfおよびstd :: stringを使用するC ++

  12. 12

    可変個引数テンプレートを使用したstd :: ref()およびstd :: bind()について少しぼんやりしています

  13. 13

    std :: functionおよびstd :: bindの戻り値

  14. 14

    パラメータを使用したvoidメソッドをstd :: functionおよびstd :: bind C ++を使用した別のメソッドに渡す

  15. 15

    std :: bindがstd :: filesystem :: pathおよびstd :: ostreamで機能しないのはなぜですか?

  16. 16

    std :: bindおよびstd :: weak_ptr

  17. 17

    オブジェクトのメソッドを使用して、std :: bindおよびstd :: function.targetでCスタイルの関数アドレスを呼び出します

  18. 18

    clang-6および-std = c ++ 17-bind(2)を呼び出せません

  19. 19

    std :: enable_ifおよびstd :: decayを使用したc ++クラスコンストラクタテンプレート

  20. 20

    テンプレート関数パラメーターでstd :: bindを使用する

  21. 21

    テンプレート関数をstd :: bindする方法は?

  22. 22

    std :: bindでテンプレート関数パラメータを使用する方法は?

  23. 23

    テンプレート引数の推定/置換がstd :: tupleおよびテンプレート派生クラスで失敗するのはなぜですか?

  24. 24

    constクラスオブジェクトをstd :: functionおよびstd :: bindに渡すとコンパイルエラーが発生します

  25. 25

    std :: function、リテラルタイプおよびテンプレート

  26. 26

    テンプレートデータでstd :: move()を安全に使用する方法

  27. 27

    可変個引数テンプレート、型推定、およびstd :: function

  28. 28

    C ++でstd :: threadを一時停止および再開するstd :: condition_variableと比較してstd :: atomicを使用するアプローチ

  29. 29

    std :: bindと可変個引数テンプレートおよび自動戻り値の型

ホットタグ

アーカイブ