2011-01-21 14 views
8

मेरे पास एक क्लास टेम्पलेट है और मुझे लगता है कि वेराडिक टेम्पलेट स्टाइल इंस्टेंटेशन कैसे करें।वीएस -2010 सी ++ वैरिएडिक टेम्पलेट उदाहरण

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 परिभाषित हो)।

पहला: वीएस -2010 में वैराडिक टेम्पलेट भी किया जा सकता है? मुझे template<typename _Classname, typename... Args>

दूसरा, क्या मैं पूरा करने की कोशिश कर रहा हूं, क्या मैं टेम्पलेट घोषणा error C2143: syntax error : missing ',' before '...' के साथ संकलित समस्याएं प्राप्त कर रहा हूं। धन्यवाद!

+2

अंडरस्कोर से शुरू होने वाले नाम '_Classname' जैसे पूंजी पत्र के बाद आरक्षित हैं और आपको अपने प्रोग्राम में उनका उपयोग नहीं करना चाहिए। –

+0

ओह .. किसके लिए आरक्षित/कौन? मैं अपना नामकरण सम्मेलन बदलने की कोशिश कर रहा हूं .. (m_, g_, आदि से बदलें) – BabelFish

+1

देखें [यह] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using -एक-अंडरस्कोर में एसी-पहचानकर्ता)। – GManNickG

उत्तर

24

विजुअल सी ++ 2010 विविध टेम्पलेट का समर्थन नहीं करता है।

+0

lol .. बमर .. :(वैसे भी जो मैं चरम मैक्रोज़ के माध्यम से कर रहा हूं उसे पूरा करने के लिए? मुझे पता है कि std :: make_shared की एक विविध शैली है लेकिन मैं सभी परिभाषाओं में खो जाता हूं। – BabelFish

+3

क्या इसका मतलब है कि माइक्रोसॉफ्ट में किसी ने किया सीमित [tuple class] (http://msdn.microsoft.com/en-us/library/bb982837.aspx) प्राप्त करने के लिए बहुत सारी प्रतिलिपि बनाना और पेस्ट करना? – Thomas

+1

नहीं .. उनके पास यह जटिल मैक्रो परिभाषित है "तंत्र" जो आवश्यक कक्षाएं बनाने के लिए परिभाषित करता है और परिभाषित करता है .. जो मैं बता सकता हूं उससे। आप इसे xxshared और xfwrap और xfwrap1 आदि – BabelFish

-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 कार्यान्वयन पर एक नज़र डाल सकते हैं।

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 variadic टेम्पलेट समर्थन के रूप में: मैं पता नहीं है सबसे पहले आप एक उपयोगिता की जरूरत है।

+0

स्टैक ओवरफ़्लो में आपका स्वागत है! –

+2

यह अच्छा होगा अगर वीएस -2010 "टाइपनाम" का समर्थन कर सके। .. " – BabelFish

+0

धन्यवाद इसने एक समान परिदृश्य हल किया जिसके साथ मुझे मदद की ज़रूरत थी। क्या एमआईटी जैसी लाइसेंस प्राप्त लाइब्रेरी में आपके tuple_indices/make_tuple_indices कोड को शामिल करना ठीक होगा? लाइसेंस यहां देखा जा सकता है: http://www.angelcode.com/angelscript/sdk/docs/manual/doc_license।एचटीएमएल – Functastic