以下にリストされているネストされた可変個引数クラス テンプレートの 2 つ (またはそれ以上) を引数として受け入れ、それらを異なる型を受け入れる別のデータ構造に入れる関数テンプレートを作成しようとしています (ペアまたはタプルは私がするものです使用する可能性が高い)。クラスとサブクラス、および関数の使用法を次に示します (関数は後で定義します)。
template<typename... Args> struct Entity {
template<typename... InnerEntArgs> struct InnerEntity {
InnerEntity(InnerEntArgs... inner_ent_args) {
... //do stuff w/ InnerEntArgs pack
... //do stuff that makes Inner dependent on Outer's Args pack
}
};
};
struct ThingA : Entity<int, string> {
... //construct ThingA
};
struct ThingB : Entity<string, string> {
... //construct ThingB
};
auto foo = my_func(
ThingA::InnerEntity<int, int, int>(1, 2, 3)
, ThingB::InnerEntity<string, int>("bar", 1)
);
以下は、関数用にまとめたコードで、正常にコンパイルされますが、正しく設定されているかどうかはわかりません。typename
具体的には、このコンテキストでコンパイラをどのように満足させて::template
いるか、またはこの関数が期待どおりに動作するかどうかについて、少しあいまいです。
template<
typename... ArgsA, typename... ArgsAInner
, typename... ArgsB, typename... ArgsBInner
> auto my_func(
typename Entity<ArgsA...>::template InnerEntity<ArgsAInner...> A
, typename Entity<ArgsB...>::template InnerEntity<ArgsBInner...> B
) -> tuple<decltype(A), decltype(B)> {
return make_tuple(A, B);
}
パラメーター パックがどのように推定/推論されているか、および、 、および末尾の戻り値の型がどのように機能しているかについては十分に把握していると思いますが、間違っている場合はその方法を教えてください。auto
decltype
また、ネストされた可変個引数クラスのテンプレートをいくつでも受け入れて適切なコンテナーまたはデータ構造に入れることができるこの関数の可変個引数バージョンを誰かが実証したい場合、それは素晴らしいことですが、私は主に完全に理解することに関心がありますtypename
と::template
。お早めにどうぞ!
*このタイトルの表現が間違っていたり、用語を混同している場合は、説明してください. :) 私は学ぶためにここにいます。