简单的参数包扩展:预期&#39 ;;'

时间:2014-05-25 20:27:00

标签: c++ templates c++11 variadic-templates g++4.8

在以下代码段中:

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'

我的代码出了什么问题?

2 个答案:

答案 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() {}