variadic模板歧义 - 空参数包
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;
}
是否可以为空参数包提供模板专业化?
您可以做的是在variadic超载中添加另一个模板参数,例如
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 = {}
实例化第一个模板?如果您想适当地专注于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 = {}
实例化的一个和唯一的模板,然后将其用于选择Args = {}
专业化(第二个定义(。
您可以继续以下内容:
template<typename T, typename... Args>
inline void f() { f_wrapper<T, Args...>::f(); }
相关文章:
- C++17 中的歧义错误(模板模板参数和默认参数问题)
- 关于模板化函数上传递的右值引用和传递的参数的歧义
- C++ 显式多参数构造函数歧义
- variadic模板歧义 - 空参数包
- 函数调用带有指针、引用和常量引用参数的歧义
- 如何在C++中消除一个可变参数函数与另一个可变参数函数的歧义
- 更改专用化"template<...>"行中模板参数的顺序是否会导致定义重复或歧义?
- 使用默认参数消除函数的歧义
- 函数参数绑定的完美转发和歧义
- 可变参数模板、参数包及其在参数列表中讨论的歧义
- 使用初始值设定项列表作为参数时存在歧义
- 可变类型的部分模板专门化和扩展到外部类型的可变参数包会导致歧义
- C++11:在按值传递参数初始化时转换构造函数和转换函数之间的歧义
- 采用可选且无参数的重载方法:为什么没有歧义
- 消除作为模板参数传递的重载成员函数指针的歧义
- C++11参数子句中声明符和抽象声明符之间的歧义
- 当添加模板参数时,重载解析会产生歧义调用
- 绕过依赖于参数的查找歧义的非侵入性方法
- 模板参数为模板歧义符号
- 如何消除具有相同模板参数名称的模板类的两个实例的歧义