Avr*_*dis 3 c++ templates variadic-templates c++11
我正在研究关于Variadic模板的新C++ 11功能,所以我写了一个fun模板函数:
template <typename T>
void fun(T& a) //Base to stop the recursion
{
std::cout << a;
};
template <typename... Types>
void fun(Types... args)
{
fun(args...);
};
Run Code Online (Sandbox Code Playgroud)
模板编译得很好,但是当我写下main 像fun(1,10.232,1232);我得到的东西时
Segmentation fault.任何人都可以向我解释为什么会这样吗?
我不知道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).
};
Run Code Online (Sandbox Code Playgroud)
您的基本案例通过引用绑定,这不是一个好主意,因为您在呼叫站点传递临时对象.这可能是您的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...);
}
Run Code Online (Sandbox Code Playgroud)
或修改递归重载以接受两个或多个参数.
// 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...);
}
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,尽量避免出现多个函数模板是扩展的候选者的情况,并且你会避免很多麻烦.换句话说:每个重载应该是互斥的.
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |