[英]Variadic template ambiguity - empty parameter pack
如何消除此代码的歧义? ( 在这里尝试 )
template <typename T>
inline void f()
{
}
template<typename T, typename ... Args>
inline void f()
{
f<Args...>();
}
int main()
{
f<char, double, int>();
return 0;
}
这是我找到的解决方案...但是我对此并不满意。 ( 在这里尝试 )
template <int N>
inline void f()
{
}
template<int N, typename T, typename ... Args>
inline void f()
{
f<42,Args...>();
}
int main()
{
f<42,char, double, int>();
return 0;
}
是否可以为空参数包提供模板专业化?
您可以做的是向可变参数重载中添加另一个模板参数,例如
template<typename T, typename U, typename ... Args>
inline void f()
{
f<U, Args...>();
}
这种测量只能使用2个或更多参数来调用该函数,因此在单个参数或单个参数与空包之间不再存在歧义。
如果您可以使用C ++ 17,则取决于您要在函数中实现的功能,您也许还可以切换到使用折叠表达式
您根本没有专门的f
! 您已经超负荷了。 也就是说,您有两个名为f
模板,并且要使用哪个模板是不明确的。 考虑调用f<int>()
。 您是要使用T = int
实例化第一个模板,还是要使用T = int; Args = {}
实例化第二个模板T = int; Args = {}
T = int; Args = {}
? 如果您想适当地对f
进行专业化,我认为实际上需要将其包装到一个类中(以允许部分专业化):
template<typename T, typename... Args>
struct f_wrapper
{
static inline void f()
{
f_wrapper<Args...>::f();
}
};
然后,您可以使用以下语法对其进行专门化:
template<typename T>
// the brackets v v distinguish specialization from overloading
// you can't overload classes anyway, but it's important for functions
struct f_wrapper<T>
{
static inline void f()
{
}
};
现在,有一个名为f
类模板,它具有两个特长。 f_wrapper<int>::f()
没有歧义。 唯一的模板用T = int; Args = {}
实例化T = int; Args = {}
T = int; Args = {}
,然后用于选择Args = {}
专业化(第二个定义)。
然后,您可以继续包装以下内容:
template<typename T, typename... Args>
inline void f() { f_wrapper<T, Args...>::f(); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.