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

可変個引数テンプレートは、ハッキングの際のこじつけのパッチです。これを楽しむことはできません。これを行う方法 (頭の中で) は、テンプレートの特殊化と継承を併用することです。これらの行に沿ったもの:

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 に答える