C ++可变参数模板推导失败

m2j

我已经编写了带有递归评估的可变参数模板函数。对于最后一个参数,我实现了没有可变参数包的专业化,并且一切正常。

现在,我想将可变参数函数参数转换为模板参数。

这是我的尝试:

template<typename N, int p> // specialization
N constexpr myadd(const N &n)
{
    return n + p;
}

template<typename N, int p, int ... v> // variadic
N constexpr myadd(const N &n)
{
    return myadd<N, v...>(n) + p;
}

int testfun()
{
    return myadd<int, 2>(7);
}

gcc和clang报告了模棱两可的重载,并且无法使用空参数包在'specialization'和'variadic'之间进行选择

我尝试删除特殊化并检查可变参数模板中的包大小,但是如果没有特殊化,编译器将无法推断出参数'p'

法国

该答案所述,可变参数包确实可以是空的。但是您可以使用SFINAE专门处理非空可变参数包的情况

例如:

#include <iostream>
#include <type_traits>

template<typename N, int p> // specialization
N constexpr myadd(const N &n)
{
    std::cout << "specialization" << std::endl;
    return n + p;
}

template<typename N, int p, int ... v, class = std::enable_if_t<(sizeof...(v) > 0)>> // variadic
N constexpr myadd(const N &n)
{
    std::cout << "variadic" << std::endl;
    return myadd<N, v...>(n) + p;
}

int main()
{
    std::cout <<  myadd<int, 2>(7) << std::endl;
    std::cout <<  myadd<int, 2, 4>(7) << std::endl;
    
    return 0;
}

看到它住在Coliru

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++可变参数模板参数迭代

来自分类Dev

c ++ 11递归可变参数模板

来自分类Dev

可变参数模板和C数组

来自分类Dev

C ++可变参数模板基础

来自分类Dev

C ++可变参数模板产品

来自分类Dev

c ++ 11递归可变参数模板

来自分类Dev

C ++-从可变参数模板制作Tupple

来自分类Dev

C++ 可变数量的可变参数模板参数

来自分类Dev

可变参数模板参数包推导失败

来自分类Dev

C ++-模板参数推导/替换失败

来自分类Dev

C ++ 17模板参数推导失败

来自分类Dev

C ++中转换函数模板参数推导的含义

来自分类Dev

C ++在可变参数模板内部专门化可变参数模板

来自分类Dev

在C ++中使用可变参数模板迭代参数包

来自分类Dev

C ++中没有参数可变参数模板函数

来自分类Dev

获取C ++可变参数模板参数的序数

来自分类Dev

线性层次结构的C ++可变参数模板参数

来自分类Dev

C ++可变参数模板参数遇到问题

来自分类Dev

将 C 数组转换为可变参数模板参数

来自分类Dev

C ++可变参数模板方法专业化

来自分类Dev

C ++使用可变参数模板绑定成员函数

来自分类Dev

C ++-可变参数模板部分专业化

来自分类Dev

C ++ 11中的可变参数模板和多重继承

来自分类Dev

C ++可变参数模板特化(和static_assert)

来自分类Dev

C ++ 11可变参数模板和std :: endl

来自分类Dev

用可变参数模板在C ++中包装函数指针

来自分类Dev

C ++可变参数模板和评估顺序

来自分类Dev

通过可变参数模板的C ++ 11构造函数继承

来自分类Dev

c ++ 11语法可变参数模板随rebind扩展