9

私はこのコードを書きましたが、現在、1 つの void コールバックを受け入れ、それに 1 つの値を渡すことができます。ただし、ユーザーが複数の引数を設定できるようにする方法はありますか? おそらく Callback Caller のようなものです。複数の型名を定義せずに Callback の代わりに? どういうわけか、これをすべて 1 つの型名に収めることはできますか?

たとえば、ここに私のクラスがあります

template <typename T>
class Callback
{
private:
    std::vector<std::function <void (T)>> func;
public:
    virtual void operator += (std::function<void (T)> _func)
    {
        func.push_back(_func);
    }

};

私はこのように使用します:

Callback<int> Test;

関数に引数を 1 つだけ渡したい場合は、問題なく動作します。ただし、複数の型名を持たなくても、ユーザーが複数の値を定義できるようにすることは可能ですか?

いえ

Callback< <(int, int, int)> > Test;

それに似た何か?

4

2 に答える 2

13

C++11 では、可変個引数テンプレートを使用します。

template <typename... Ts>
//                ^^^^^^ Parameter pack
class Callback
{
private:
    std::vector<std::function <void (Ts...)>> func;
//                                   ^^^^^
//                                   Parameter pack expansion
public:
    virtual void operator += (std::function<void (Ts...)> _func)
//                                                ^^^^^
//                             Parameter pack expansion             
    {
        func.push_back(_func);
    }
};

これで、次の方法でクラスをインスタンス化できます。

Callback<int, int, int>
Callback<double, std::string>
Callback<bool>
Callback<>
...
于 2013-05-28T23:10:27.497 に答える
1

boost::mpl::setC++0x がなくても、一連の型を渡すために使用できます。引数の順序が必要な場合は、boost::mpl::vector.

詳細については、 http://www.boost.orgを参照してください。

于 2013-05-28T23:42:16.703 に答える