複数のクラスから継承するクラスを作成しようとしています(バリデーションテンプレートで定義されています)。クラスごとに同じパラメータargsを各クラスのコンストラクタにパックします。しかし、クラスのバリデーションテンプレートとargsのパラメータパックの両方をアンパックすることはできないようです。バリデーションテンプレートで定義された各クラスのコンストラクタにargsのパラメータパックを展開する
私はクラスを持っている:コンストラクタで
template<class... __Policies>
class GenericPolicyAdapter : public __Policies...{
:
template<class... __Args>
GenericPolicyAdapter(__Args... args) : __Policies(args...){
とテスト:
error: type ‘__Policies’ is not a direct base of ‘GenericPolicyAdapter<T1,T2>’
:
GenericPolicyAdapter<T1,T2> generic_policy_adapter(arg1, arg2, arg3);
gccがで失敗
どこ__Policies = T1, T2
明確にするために、私は基本的にやろうとしている:
GenericPolicyAdapter : public T1, public T2
{
public:
template<class... __Args>
GenericPolicyAdapter(__Args... args) : T1(args...), T2(args...){}
};
が、T1
と__Policies
任意のアイデアから推定T2
と? gccはタイプリストではなく単一のタイプとして__Policies
を扱っているようです。前もって感謝します!
編集:
私はGCC/G ++ 4.4.5を使用していることを明確にすべきです。
ハワードヒナントの提案を行うことでした。
template<class... __Args>
GenericPolicyAdapter(__Args... args)
: __Policies(args...)...
{}
しかし、GCC/G ++ 4.4.5で、これはinvalid use of pack expansion expression
を与えます。これはOSX/clangでうまくいきますが、gcc/g ++でこれを行う方法はありますか?
4.4はC++ 11のサポートに関して古くからあり、4.6の可変的なテンプレートサポートでも、特にパラメータパックのアンパックは不完全であることに注意してください。 – PlasmaHH
本当にC++に興味があれば、gcc 4.7(4.8よりも古い)を使用しようとしないでください。 – OneOfOne
また、 '__'または' _ 'で始まる識別子をあなたのコード。これらのパターンは、コンパイラとその標準ライブラリ用に予約されています。新しいバージョンのコンパイラは警告なしに '#define __Args'を導入し、コードを壊すことがあります。 –