2011-01-21 101 views
8

我有一個類模板,我似乎無法弄清楚如何執行Variadic模板樣式實例化。VS2010 C++ variadic模板示例

這裏是「代碼」到目前爲止,什麼我在尋找:

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。

第一:可以在VS2010中完成Variadic模板嗎?我得到的編譯問題只是模板聲明error C2143: syntax error : missing ',' before '...'從行template<typename _Classname, typename... Args>

其次,我可以嘗試完成什麼?謝謝!

+2

以`_Classname`之類的大寫字母后跟大寫字母開頭的名稱被保留,您不應在程序中使用它們。 – 2011-01-21 21:06:38

+0

哦..保留給什麼/誰?我一直試圖改變我的命名約定..(從m_,g_等改變) – BabelFish 2011-01-21 21:09:15

+1

請參閱[this](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using -an下劃線-在-AC-標識符)。 – GManNickG 2011-01-21 21:45:43

回答

24

Visual C++ 2010不支持可變模板。

-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實現的東西,實際上有效。

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可變參數模板支持:我不知道。