ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 扩展可变参数模板函数会导致分段错误

2019-08-25 19:09:24  阅读:137  来源: 互联网

标签:c c11 templates variadic-templates


我正在研究关于Variadic模板的新C 11功能,所以我写了一个有趣的模板功能:

template <typename T>
void fun(T& a) //Base to stop the recursion
{
  std::cout << a;
};

template <typename... Types>
void fun(Types... args)
{
  fun(args...);
};

模板编译得很好但是当我在主要的东西上写的时候
有趣(1,10.232,1232);我遇到了分段错误.任何人都可以向我解释为什么会这样吗?

解决方法:

我不知道seg-fault,但你永远不会调用你的基本函数.每次调用后,您需要缩小参数列表:

template <typename T>
void fun(T& a) //Base to stop the recursion
{
    std::cout << a;
};

template <typename First, typename... Types>
void fun(First arg, Types... args)
{
    fun(args...); // recursion on args... (one smaller than what was passed in).
};

您的基本案例通过引用绑定,这不是一个好主意,因为您在呼叫站点传递临时对象.这可能是您的seg-fault来自的地方.要么通过const引用更改要接受的函数,要么通过值更改.

另请注意,我没有编译上面的代码,因此当您使用一个参数调用fun时,最终可能会陷入模糊的情况.要解决此问题,请更改基本案例以不接受任何参数:

void fun()
{
    // base case: no items.
}

template <typename First, typename... Rest>
void fun(First first, Rest... rest)
{
    // one or more items (the param pack is allowed to be emoty.)
    fun(rest...);
}

或修改递归重载以接受两个或多个参数.

// Exactly one argument.
template <typename T>
void fun(T a)
{
    std::cout << a;
};

// Two or more arguments.
template <typename First, typename Second, typename... Rest>
void fun(First first, Second second, Rest... rest)
{
    // one or more items (the param pack is allowed to be emoty.)
    fun(second, rest...);
}

无论哪种方式,尽量避免出现多个函数模板是扩展的候选者的情况,并且你会避免很多麻烦.换句话说:每个重载应该是互斥的.

标签:c,c11,templates,variadic-templates
来源: https://codeday.me/bug/20190825/1721775.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有