2011-01-21 10 views
8

私はクラステンプレートを持っています。私はVariadic Templateスタイルインスタンシエーションの実行方法を理解できないようです。明らかにこれは:)コンパイルされませんVS2010 C++バリデーションテンプレートの例

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>

第2に、達成しようとしていることができますか?ありがとう!

+2

'_Classname'のようにアンダースコアで始まる大文字の名前は予約されており、プログラムで使用しないでください。 –

+0

ああ..何のために予約?/ who?私は私の命名規則を変更しようとしています..(m_、g_などからの変更) – BabelFish

+1

[this](http://stackoverflow.com/questions/228783/what-are-the-rules-about-usingを参照してください。 - アンダースコアのAC識別子)。 – GManNickG

答えて

24

Visual C++ 2010はバリデーションテンプレートをサポートしていません。

+0

LOL .. Bummer ..:とにかく私はvariadicマクロを使って何をやっているのですか?私はstd :: make_sharedは可変的なスタイルを持っていますが、すべての定義が失われていることを知っています – BabelFish

+3

Microsoftの誰かが制限された[タプルクラス](http://msdn.microsoft.com/en-us/library/bb982837.aspx)を取得するためのコピーと貼り付けの多く? – Thomas

+1

いいえ..これらの非常に複雑なマクロは "メカニズム"を定義しています。それは、必要なクラスを作成するための定義と定義を解除することができます。私はあなたがファイルxxsharedとxfwrapとxfwrap1などでそれを見ることができます – BabelFish

-2

バリデーショナルテンプレートは、ハックしたときにクラッジにパッチを当てます。これを楽しむことはありません。これを行う方法は、テンプレートの特殊化と継承を併用することです。これらの行に沿ったもの:

私は決してこれをやっていないし、テストしていないが、これは一般的な考えである。あなたは実際に動作する何かのためにstd::tupleの実装を見ることができます。

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可変長引数テンプレートのサポートなど:私は考えています。

+0

ようこそスタックオーバーフロー! –

+2

VS2010が "typename"をサポートできるなら、これは素晴らしいことでしょう。 .. " – BabelFish

+0

これは非常に似たシナリオを解決してくれてありがとう、私は助けが必要でした。あなたのtuple_indices/make_tuple_indicesコードをMITのようなライセンスライブラリに含めることは大丈夫でしょうか? ライセンスはこちらからご覧ください: http://www.angelcode.com/angelscript/sdk/docs/manual/doc_licensehtml – Functastic

関連する問題