我有一个可变参数模板函数,其中常规模板参数遵循参数包:
template <class T, class... Args, class U = T>
void foo(Args...);
我想为此函数声明 extern 模板实例化。天真的方法行不通:
extern template void foo<SomeT, int, double, SomeU>();
// Explicit instantiation of 'foo' does not refer to a function template,
// variable template, member function, member class, or static data member
// main.cpp:11:6: note: candidate template ignored: failed template argument deduction
据我了解,参数包是贪婪的,因此
SomeU
被视为 Args
的一部分,从而使 U
不匹配。
如何克服贪婪,在不修改函数声明的情况下制作 extern 模板?
一些澄清:最后一个参数用于某种 SFINAE。我们可能会使用概念来重写它,但还不能使用它们。该函数来自库,我最好不要修改它。
extern template void foo<SomeT, int, double, SomeU>();
无论如何,这都不是函数模板的有效显式实例化。您还必须始终提供正确的参数类型。
确实如此
extern template void foo<SomeT, int, double, SomeU>(int, double);
这确实应该可以编译。显式实例化所针对的函数模板是通过正常的模板参数推导和重载解析机制来决定的,就像正在实例化的特定专业化一样。