21

CallBackAtInit初期化時に関数を呼び出すことだけを目的とした名前のクラステンプレートを定義しました(コンストラクター)。関数はテンプレートパラメータで指定されます。std::function問題は、テンプレートがパラメータとして受け入れられないことです。ただし、関数ポインタを受け入れます。なんで?

これが私のコードです:

#include <iostream>
#include <functional>

/* Does not work:*/     template <typename return_type, typename arg_type, std::function<return_type(arg_type)> call_back>
/* Work fine: *///      template <typename return_type, typename arg_type, return_type(*call_back)(arg_type)>

class CallBackAtInit {
public:
    CallBackAtInit(arg_type arg)
    {
        call_back(arg);
    };
};

void printInt(int i);

class HoldInt : private CallBackAtInit<void, int, printInt> {
public:
    HoldInt(int integer)
    : CallBackAtInit(integer)
    {}
    // ...
};

int main(int argc, char** argv)
{
    HoldInt hi(10);
    return 0;
}

void printInt(int i)
{
    std::cout << i << std::endl;
}
4

2 に答える 2

14

テンプレート定義のパラメーターには、次の4種類があります。

  • タイプ(またはテンプレートタイプ)のみを受け入れることができるパラメーター。
  • 整数値のみを受け入れることができるパラメータ。
  • メンバーへのポインタ値のみを受け入れることができるパラメータ。
  • std::nullptr_t(C ++ 11以降)

テンプレート定義で言及する場合std::function、それは上記のカテゴリのどちらにも該当しません。テンプレートは型を受け入れることも、整数値またはメンバーへのポインター値を受け入れることもできません。

パラメータが関数ポインタ型の場合、整数値である関数ポインタ(型に一致する関数のアドレス)を受け入れることができます。アドレスは常に整数値であることに注意してください。したがって、それは2番目のカテゴリに分類され、それが機能する理由です。

于 2012-12-01T16:49:19.970 に答える
2

標準では許可されていないため:

14.1テンプレートパラメータ

4非型テンプレートパラメータは、次の(オプションでcv修飾された)型のいずれかを持つ必要があります。

—整数型または列挙型、

—オブジェクトへのポインタまたは関数へのポインタ

—オブジェクトへの左辺値参照または関数への左辺値参照、

—メンバーへのポインタ、

— std::nullptr_t。

于 2012-12-01T16:48:42.510 に答える