繁体   English   中英

可变参数模板的歧义-空参数包

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM