1

関数とパラメーターを全体としてバインドし、バインドされた関数の戻り値の型によって区別される Binder という名前のテンプレート クラスを作成しようとしています。これが私のアプローチです。

template <typename return_type>
class Binder
{
    public:
        virtual return_type call() {}
};

呼び出しcallは、パラメーターを使用して事前にバインドされた関数を呼び出し、結果を返します。実際のバインディング ジョブを実行する Binder から継承されたいくつかのテンプレート クラスが必要です。以下は、1 パラメータ関数バインディング クラスです。

template<typename func_t, typename param0_t>
class Binder_1 : public Binder< ***return_type*** > 
        // HOW TO DETERMINE THE RETURN TYPE OF func_t? 
        // decltype(func(param0)) is available when writing call(),
        // but at this point, I can't use the variables...
{
    public:
        const func_t &func;
        const param0_t &param0;

        Binder_1 (const func_t &func, const param0_t &param0)
            : func(func), param0(param0) {}

        decltype(func(param0)) call()
        {
            return func(param0);
        }            
}
// Binder_2, Binder_3, ....

これは私が達成したいことです:

template<typename func_t, typename param0_t>
Binder_1<func_t, param0_t> bind(const func_t &func, const param0_t &param0)
{
    reurn Binder_1<func_t, param0_t>(func, param0);
}

// ... `bind` for 2, 3, 4, .... number of paramters

int func(int t) { return t; }

double foo2(double a, double b) { return a > b ? a : b; }
double foo1(double a) { return a; }
int main()
{
    Binder<int> int_binder = bind(func, 1);
    int result = int_binder.call(); // this actually calls func(1);

    Binder<double> double_binder = bind(foo2, 1.0, 2.0);
    double tmp = double_binder.call(); // calls foo2(1.0, 2.0);
    double_binder = bind(foo1, 1.0);
    tmp = double_binder.call(); // calls foo1(1.0)
}

bindブーストライブラリの機能をこの機能を実現するために適応させることはできますか? 同様のソリューションも大歓迎です!

4

2 に答える 2

1

紹介しstd::declval<T>()ます。

これは、次のように宣言されたダミー関数です。

template <typename T>
typename std::add_rvalue_reference<T>::type declval();

// This means it returns T&& if T is no a reference 
//                     or T& if T is already a reference

実際に定義されることはありません。

sizeofしたがって、または...などの未評価のコンテキスト内でのみ使用されますdecltype

これにより、次のことが可能になります。

template<typename func_t, typename param0_t>
class Binder_1: public Binder<decltype(std::declval<func_t>()(std::declval<param0_t>())>

少し冗長ですが、ちょっと!できます :)

于 2012-04-24T07:53:52.667 に答える
0

使えるかもresult_of

于 2012-04-24T06:42:54.303 に答える