这个问题与此类似 C++ - Multiple parameter packs for variadic function,但专门针对结构。
以下内容编译并运行良好(取自链接的问题)。
template <typename... TDependencies, typename ...TArgs>
void fooFunction(TArgs...args) {
std::cout << "TDependecies list:" << std::endl;
((std::cout << "- " << typeid(TDependencies).name() << std::endl), ...);
std::cout << "TArgs list:" << std::endl;
((std::cout << "- " << typeid(TArgs).name() << std::endl), ...);
}
int main()
{
fooFunction<std::string, short, int, long, long long>(0, 1l, 2ll);
}
因为类型推导将根据提供给
fooFunction
的参数成功。
我的问题是,为什么这样的结构不能进行推导?
template <typename... TDependencies, typename ...TArgs>
struct fooStruct {
fooStruct(TArgs...args) {
std::cout << "TDependecies list:" << std::endl;
((std::cout << "- " << typeid(TDependencies).name() << std::endl), ...);
std::cout << "TArgs list:" << std::endl;
((std::cout << "- " << typeid(TArgs).name() << std::endl), ...);
}
};
int main()
{
fooStruct<std::string, short, int, long, long long> s(0, 1l, 2ll);
}
编译器错误是
parameter pack ‘TDependencies’ must be at the end of the template parameter list
。
我尝试添加如下所示的用户推导指南,但这给出了错误
trailing return type ‘<type error>’ of deduction guide is not a specialization of ‘fooStruct<<declaration error>, TArgs>’
template <typename... TDependencies, typename ...TArgs>
fooStruct(const TArgs...) -> fooStruct<TDependencies..., TArgs...>;
有什么办法可以做到这一点吗?
就上下文而言,最终目标是使用类似的方法将两个可变参数包压缩在一起。
template <typename T1, typename T2>
struct base {
};
template <typename... T1, typename ...T2>
struct child : base<T1, T2>... {
child(T2... args) {}
};
child
这里将使用 T2
但基础将使用 T1
和 T2
。
错误很明显:标准禁止这样做。
要解决您的问题,您需要一个工厂功能。而且您知道如何编写该工厂函数。
标准禁止部分CTAD。它很复杂而且不清楚,所以他们取消了它。因此,除了工厂函数之外,没有办法推导出一半的参数。
template<class...Explicit, class...Implicit>
foo<pack<Explicit...>, pack<Implicit...>>
make_foo(Implicit...);
使用
template<class...>struct pack{};
将参数分隔成两个包。