c ++ 11语法可变参数模板使用rebind进行扩展

时间:2014-11-30 14:24:41

标签: visual-c++ c++11 gcc metaprogramming

这是一种有效的c ++语法吗?

template<typename Var, typename T>
struct rebindVar;

template<typename Var, typename... T>
struct rebindVar<Var, std::tuple<T...> > {
  typedef typename std::tuple< typename T::template rebindVar<Var>::type... > type;
};

在gcc中工作,在vs2013中不起作用。错误消息显示:

Error   1   error C3546: '...' : there are no parameter packs available to expand   C:\Users\Alexandros\Desktop\project\tnnlib\src\NeuralNetwork\NeuralNetwork\Perceptron\Perceptron.h  55  1   NeuralNetwork_ut

1 个答案:

答案 0 :(得分:2)

MSVC的可变参数模板实现是一个巨大的混乱,许多稍微复杂的扩展模式不起作用。通常的解决方法是将复杂零件提取到辅助模板中。试试这个:

template <typename Var, typename T>
struct rebindOne { typedef typename T::template rebindVar<Var>::type type; };

template<typename Var, typename... T>
struct rebindVar<Var, std::tuple<T...> > {
  typedef typename std::tuple< typename rebindOne<Var, T>::type... > type;
};