在以下代码段中:
void normalize(path& p)
{
// do something with p
}
template<typename... T>
void normalize(T&... t)
{
normalize(t)...; // (L)
}
在我的实际理解中,第(L)
行扩展为:
template<typename... T>
void normalize(T&... t) // T = {t1, t2, t3}, for example
{
normalize(t1), normalize(t2), normalize(t3);
}
并且这些表达式中的每一个都将执行normalize
的单参数版本。但是,g++
(4.8.1)会引发以下错误:
prueba.cpp: In function 'void normalize(T& ...)':
prueba.cpp:155:17: error: expected ';' before '...' token
normalize(t)...;
^
prueba.cpp:155:20: error: parameter packs not expanded with '...':
normalize(t)...;
^
prueba.cpp:155:20: note: 't'
我的代码出了什么问题?
答案 0 :(得分:4)
在此上下文中不允许扩展参数包。如果您创建帮助程序类pass
,则可以执行以下操作:
pass{(normalize(std::forward<T>(t)), 0)...};
帮助程序类pass
可能如下所示:
struct pass
{
template <typename ...Args>
explicit pass(Args&&...) { }
};
答案 1 :(得分:0)
我认为您需要将参数包解压缩到函数调用站点或元组中,如下所示:
make_tuple(normalize(t)...); // (L)
例如,以下代码将在gcc-4.8.1下编译:
#include <tuple>
using namespace std;
typedef int path;
void normalize(path& p)
{
// do something with p
}
template<typename... T>
void normalize(T&... t)
{
auto tp = make_tuple(normalize(t)...); // (L)
//do whatever you want with the components of tp ...
}
main() {}