9

我有一个类模板,但我似乎无法弄清楚如何执行 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 Template 甚至可以在 VS2010 中完成吗?我只是error C2143: syntax error : missing ',' before '...'从该行的模板声明中遇到编译问题template<typename _Classname, typename... Args>

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

4

3 回答 3

27

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

于 2011-01-21T21:05:12.310 回答
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 可变参数模板支持:我不知道。

于 2011-01-22T00:50:46.190 回答
-2

可变参数模板是 hack 上的一个补丁——你不会喜欢这个。做到这一点的方法(在我的脑海中)是使用模板专业化和继承。这些方面的东西:

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实际有效的实现。

于 2011-01-21T21:10:52.060 回答