関数のラッパーを生成するテンプレートクラスを作成しようとしています。その後、クラスは結果としてラッパーを返します。テンプレートを使用して、次のような異なるシグネチャを持つ任意の関数で機能する一般的なクラスを作成したいと思います。
std::function<void()>task = std::bind(fun1, param1, param2);
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]
コメントを追加