2016-12-15 21 views
6

द्वारा बुलाया जाता है, तो मुझे कुछ चेक करना पसंद है जब मेरे ctors में से एक को संकलित समय ज्ञात मान के साथ बुलाया जाता है। क्या इसका पता लगाने का कोई तरीका है?SFINAE: यह पता लगाना कि किसी फ़ंक्शन को संकलित समय

तो जब कोई इस फोन:

A a (10); 

10 के बाद से एक संकलन लगातार ज्ञात समय है, मैं इस तरह, एक विशेष ctor कहते हैं:

template<int Value, typename = std::enable_if_t<Value <= 100>> 
A (int Value) {} 

किसी भी विचार मैं कैसे हल कर सकते हैं इस मुद्दे? धन्यवाद! तब

struct A { 
    template<int v, std::enable_if_t<(v <= 100)>* = nullptr> 
    A(std::integral_constant<int, v>) {} 
}; 

, आप इसे इस तरह से उपयोग कर सकते हैं:

उत्तर

4

इंटीग्रल लगातार अपनी समस्या को हल कर सकता है

A a{std:integral_constant<int, 7>{}}; 

उपयोग में आसानी के लिए, आप भी कुछ इसी तरह करने के लिए इस्तेमाल कर सकते हैं क्या boost::hana करता है। यह एक शाब्दिक ऑपरेटर कि एक अभिन्न निरंतर में नंबर बदलने को परिभाषित:

A a{76_c}; // the ""_c operator outputs an std::integral_constant<int, 76> 

आप में विचार के लिए boost::hana documentation

+0

धन्यवाद इस ऑपरेटर के बारे में अधिक पढ़ सकते हैं, दुर्भाग्य से यह नहीं है। मेरे lib का एक महत्वपूर्ण बिंदु यह है कि इसे सरल आदिम प्रकार के रूप में उपयोग करना आसान होना चाहिए। 99% सी ++ प्रोग्रामर की तरह integral_constant के बारे में भी नहीं पता है। – Melkon

+4

यह वास्तव में एक बहुत अच्छा समाधान है, +1, और बाकी 99% सी ++ प्रोग्रामर को 'integral_constant' के बारे में सीखना चाहिए :) मैं निश्चित रूप से इस मार्ग पर जाऊंगा यदि आप चाहते हैं कि यह संकलन में कुछ स्थिरांक के मूल्यों का परीक्षण कर रहा हो पहर। – vsoftco

+0

@ vsoftco यह संदर्भ है: मैं एक आविष्कार lib पर काम कर रहा हूं जिसका अर्थ है प्राचीन प्रकार के आधार पर आवेषण (या अन्य प्रकार के चेक) को प्रतिस्थापित करना और उन्हें प्रकार की जानकारी में रखना। इसका उद्देश्य आदिम प्रकार के जितना सरल होना है, लेकिन अच्छे और अधिक कुशल कोड का उत्पादन करना है। यह integral_constant संस्करण एक अच्छा जोड़ा है, लेकिन मेरा लक्ष्य चुपचाप चीजों को अनुकूलित करना है, उपयोगकर्ताओं को इसके बारे में भी सोचना है। निश्चित रूप से, कुछ integral_constant का उपयोग करेंगे, लेकिन अधिकतर नहीं, और ईमानदारी से, अगर उन्हें इसका उपयोग करना है, तो कोड अच्छा नहीं होगा, जो कुछ मैं प्राप्त करना चाहता हूं। – Melkon

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