【发布时间】:2011-04-15 22:35:48
【问题描述】:
我正在尝试制作一个函数模板,它将接受下面列出的两个(或更多)嵌套可变参数类模板作为参数,并将它们放入另一个接受不同类型的数据结构中(pair 或 tuple 是什么我很可能会使用)。以下是类和子类,以及我的函数的用法(函数在下面进一步定义):
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。提前谢谢!
*如果我对这个标题的措辞有误或者我混淆了术语,请解释一下。 :) 我是来学习的。
【问题讨论】:
标签: c++ templates function c++11 variadic