そこで、最近、c ++ 11の可変個引数テンプレートを使用してデリゲートシステムを構築しました。これは、魅力として機能します。
ただし、システムでは、関数への引数を作成時に(必要に応じて)指定しましたが、呼び出し時に(可変の)数の引数を渡すこともできるようにしたいと思います。これを実現するために、コードをやり直しましたが、ここで問題が発生します。
error: parameter packs must be at the end of the parameter list
sorry, unimplemented: cannot expand ‘Arguments ...’ into a fixed-length argument list
error: type/value mismatch at argument 1 in template parameter list for ‘template<<declaration error>, class ... Params> class FunctionDelegate’
...そして今後さらに多くのことが起こるので、これが問題を引き起こしたスニペットです。
template<typename... Params>
class Runnable
{
public:
virtual void invoke(tuple<Params...> params) = 0;
virtual ~Runnable()
{
}
};
これは、私の2つのデリゲート(FunctionDelegateとObjectDelegate)の親クラスです。これは以前はテンプレート化されていないクラスでした(invokeは引数を取らなかったため)が、可変個引数のテンプレートリストがあるため、サブクラスも変更する必要があり(明らかに)、別の可変個引数を追加しましたそれらへのテンプレート;
template<typename... Arguments, typename... Params>
class FunctionDelegate : public Runnable<Params...>
{
public:
typedef void (*FunctionType)(Arguments..., Params...);
FunctionDelegate(FunctionType function, tuple<Arguments...> args)
: function(function), args(args)
{
}
void invoke(tuple<Params...> params)
{
callFunction(typename gens<sizeof...(Arguments)>::type(), params, typename gens<sizeof...(Params)>::type());
}
private:
template<int... S, int... R>
void callFunction(seq<S...>, tuple<Params...> params, seq<R...>)
{
function(get<S>(args)..., get<R>(params)...);
}
private:
FunctionType function;
tuple<Arguments...> args;
};
ただし、これは許可されていないようです。少なくとも、私が思うにそうです。
- 2つの可変個引数テンプレートリストを持つことは許可されていますか?
- コンパイラにヒントを与える方法はありますか?それについては、どのリストに行きますか?(つまり、コンストラクターで使用されるものは引数に送られ、残りはParamsに送られます)。
- これを行う方法がない場合(2つの可変個引数テンプレートリストを使用)、同じ可変個引数リストで1つの引数とパラメーターを使用し、コンストラクターへの引数を使用してそれを単純に分割することはできませんか?
- 私が試みていることを達成する他の方法はありますか?(単純な古い、型チェックされていない可変個引数パラメーターの受け渡しを使用する場合を除く)。
ヘルプや洞察は大歓迎です。