VS2010 C ++可变参数模板示例

时间:2011-01-21 20:58:32

标签: c++ visual-studio-2010 templates variadic

我有一个类模板,我似乎无法弄清楚如何执行Variadic Template样式实例化。

到目前为止,这是我正在寻找的“代码”:

template<typename _Classname, typename... Args>
class CFunctorStartExT 
{
  friend class CXXFactory;
protected:
  template<typename U>
  CFunctorStartExT(typename U& _functor, Args&... args) :
    m_Functor(_functor),
    m_args(args)
  {
  }
  virtual bool ProcessLoop(CSomeClass* pThread)
  {
    return m_Functor(pThread, m_args);
  }

protected:
  _Classname& m_Functor;
  Args... m_args;
};

显然这不会编译:)。我们的想法是创建一个类,它可以在构造函数中存储传入的值(如果有的话......它可能只有_Classname / U定义),以便稍后可以检索它们以传递给另一个函数中的m_Functor。

首先:Variadic模板甚至可以在VS2010中完成吗?我只是使用行error C2143: syntax error : missing ',' before '...'

中的模板声明template<typename _Classname, typename... Args>来解决编译问题

其次,我想要完成的事情可以完成吗?谢谢!

3 个答案:

答案 0 :(得分:26)

Visual C ++ 2010不支持可变参数模板。

答案 1 :(得分:3)

我相信以下内容会做你想要的。首先,你需要一个实用程序:

// make_tuple_indices

template <size_t...> struct tuple_indices {};

template <size_t _Sp, class _IntTuple, size_t _Ep>
struct make_indices_imp;

template <size_t _Sp, size_t ..._Indices, size_t _Ep>
struct make_indices_imp<_Sp, tuple_indices<_Indices...>, _Ep>
{
    typedef typename make_indices_imp<_Sp+1, tuple_indices<_Indices..., _Sp>, _Ep>::type type;
};

template <size_t _Ep, size_t ..._Indices>
struct make_indices_imp<_Ep, tuple_indices<_Indices...>, _Ep>
{
    typedef tuple_indices<_Indices...> type;
};

template <size_t _Ep, size_t _Sp = 0>
struct make_tuple_indices
{
    static_assert(_Sp <= _Ep, "make_tuple_indices input error");
    typedef typename make_indices_imp<_Sp, tuple_indices<>, _Ep>::type type;
};

然后你可以使用它来帮助你扩展一个持有你的参数的元组:

template<typename _Classname, typename... Args>
class CFunctorStartExT 
{
  friend class CXXFactory;
protected:
  template<typename U>
  CFunctorStartExT(U& _functor, Args&... args) :
    m_Functor(_functor),
    m_args(args...)
  {
  }

  virtual bool ProcessLoop(CSomeClass* pThread)
  {
    return ProcessLoop(pThread,
                       typename make_tuple_indices<sizeof...(Args)>::type());
  }

protected:
  _Classname& m_Functor;
  std::tuple<Args...> m_args;

private:
    template <std::size_t ...Indx>
    bool ProcessLoop(CSomeClass* pThread, tuple_indices<Indx...>)
    {
        return m_Functor(pThread, std::get<Indx>(m_args)...);
    }
};

至于VS2010可变参数模板支持:我不知道。

答案 2 :(得分:-2)

Variadic模板是对黑客攻击的补丁 - 你不会喜欢这个。这样做的方法(在我的头脑中)是使用模板特化与继承。这些方面的东西:

template<typename Classname, typename... Args>
class CFunctorStartExT;

template<typename Classname, typename Arg0, typename... Args>
class CFunctorStartExT : private CFunctorStartExT<Classname, Args...> {
protected:
  Arg0 m_arg;
};

template<typename Classname>
class CFunctorStartExT {
protected:
  Classname &m_Functor;
};

我以前从未这样做,也没有测试过,但这是一般的想法。您可以查看实际工作的std::tuple实现。