2017-12-15 108 views
5

मैं निर्माण करने के लिए टेम्पलेट्स लिखना चाहता हूं चलो एक इनपुट पोर्ट कहें। यह एक इनपुट इनपुट आउटपुट पोर्ट, या इनपुट पिन की सूची से किया जा सकता है। मैं उन टेम्पलेट्स को एक ही नाम रखने के लिए पसंद करता हूं। मेरे पास इनपुट-आउटपुट पोर्ट और इनपुट पिन दोनों के लिए अवधारणाएं हैं I मैंक्या सी ++ टेम्पलेट मैच (केवल) एक प्रकार की सूची, या एक अन्य प्रकार की सूची हो सकता है?

template< typename... arguments > 
struct port_in .... 

template< pin_in T > 
struct port_in<> .... 

लेकिन अब सूची संस्करण किसी भी प्रकार को स्वीकार करेगा। मैं इसे कार्यान्वयन में देख सकता हूं, लेकिन वह उस त्रुटि संदेश को खराब कर देगा जब उपयोगकर्ता उपयुक्त प्रकारों को पारित करता है। क्या मैं किसी भी तरह से सूची को एक प्रकार तक सीमित कर सकता हूं, फिर भी दूसरे प्रकार के एक टेम्पलेट पैरामीटर को अनुमति देता हूं?

उत्तर

4

आप यह सुनिश्चित करना है कि उपयोगकर्ताओं को हमेशा एक उचित त्रुटि संदेश मिलता है चाहते हैं, तो आप मूल टेम्पलेट बाध्य करने की आवश्यकता। मान लें अपने मौजूदा अवधारणाओं InputPin और InputOutputPort नाम हैं, तो आप इस प्रकार या तो इनपुट पिन के एक दृश्य या एक ही इनपुट/आउटपुट बंदरगाह को स्वीकार करने के आधार टेम्पलेट विवश कर सकता है:

template<class... Ts> 
concept bool AllInputPins = (InputPin<Ts> && ...); 

template<class... Ts> 
concept bool OneInputOutputPort = sizeof...(Ts) == 1 && (InputOutputPort<Ts> && ...); 

template <class... Args> 
    requires AllInputPins<Args...> || OneInputOutputPort<Args...> 
struct port_in { 
    // ... 
}; 
+0

यह अच्छा लग रहा है। मैं कल कोशिश करूँगा। जो मैं खो रहा था वह एक सूची को स्वीकार करने की अवधारणा की क्षमता थी। –

+0

'अवधारणा' गैर-मानक हैं। – SergeyA

+0

हां, लेकिन मैं अवधारणाओं का उपयोग कर रहा हूं (प्रश्न 'सी ++ अवधारणाओं' के साथ टैग किया गया है, और मैं प्रश्न पाठ में अवधारणाओं का उल्लेख करता हूं। –

1

सूची संस्करण संख्याओं लेने के लिए माना जाता है, तो आप इसे कर सकता है:

template<uint16_t ... Ports> 
struct port_in .... 

मुझे यकीन है कि वहाँ यह करने के लिए करता है, तो यह गैर पूर्णांक ले जा सकते हैं एक साफ रास्ता है नहीं कर रहा हूँ और आप एक वास्तविक चाहते टाइप सूची (जो कि सभी तर्कों को एक ही प्रकार की आवश्यकता नहीं है)। आप की आवश्यकता कर सकते हैं कि सभी प्रकार के एक ही होना मुझे लगता है कि आप की तरह कुछ कर सकता है:

template<typename T, std::enable_if_t<T> * = nullptr> 
struct port_in_base{}; 
template<typename T, T ... ports> 
struct port_in : port_in_base<T> .... 
+0

'मुझे यकीन है कि वहाँ एक साफ है नहीं कर रहा हूँ ऐसा करने का तरीका यदि यह गैर-पूर्णांक ले सकता है और आप एक वास्तविक प्रकार की सूची 'मानक तरीका चाहते हैं तो' std :: integral_constant' या समकक्ष पास करके ... –

+0

टेम्पलेट पैरामीटर सभी वर्ग हैं, पूर्णांक नहीं। –

संबंधित मुद्दे