我正在尝试制作一个函数模板,它将接受下面列出的两个(或更多)嵌套可变参数类模板作为参数,并将它们放入另一个将接受不同类型的数据结构中(我将最有可能使用)。以下是类和子类,以及我的函数的用法(该函数在下面进一步定义):
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
。提前谢谢!
*如果我用错了这个标题或者我混淆了术语,请解释。:) 我是来学习的。