हमारे पास जटिल टेम्पलेट वर्ग हैं जिनमें कुछ विधियां हैं जो कुछ नीतियों या प्रकारों के साथ काम नहीं करेंगे। इसलिए, जब हम उन प्रकारों का पता लगाते हैं (संकलन समय पर, प्रकार-गुणों का उपयोग करके) हम एक अच्छे संदेश के साथ एक स्थिर दावे को आग लगाते हैं।क्या मैं मैन्युअल टेम्पलेट तत्कालता से कुछ तरीकों को बाहर कर सकता हूं?
अब हम मैन्युअल टेम्पलेट इंस्टेंटेशन के बहुत सारे काम करते हैं। आंशिक रूप से ऐसा है कि तरीकों को जांचने के लिए विधियों को संकलक करने के लिए मजबूर किया जाता है। यह लाइब्रेरी उपयोगकर्ता के लिए संकलन समय भी कम कर देता है। समस्या यह है कि स्थैतिक दावे हमेशा निकाल दिए जाते हैं और इसके परिणामस्वरूप हम टेम्पलेट वर्ग को मैन्युअल रूप से प्रश्न में तुरंत चालू नहीं कर सकते हैं।
क्या इसके लिए कोई कामकाज है?
संपादित करें: यह स्पष्ट करने के लिए यहां एक उदाहरण (इस मामले में स्पष्ट इन्स्टेन्शियशन है someFunc1() पर विफल हो जाएगा:
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
EDIT2:। यहाँ एक और उदाहरण है इस बार आप देखने के लिए कि मैं क्या मतलब है कि यह संकलन कर सकते हैं। सबसे पहले सही दूर संकलन। कोड संकलन करना चाहिए। तब टिप्पणी हटाएं [2] और स्थिर अभिकथन सक्रिय होना चाहिए। अब [2] और टिप्पणी हटाएं [1]। The टिप्पणी बाहर स्थिर दावा वाई आग लग जाएगी क्योंकि आप स्पष्ट रूप से टेम्पलेट को तत्काल कर रहे हैं। मैं इसके साथ आने वाले लाभों के कारण स्पष्ट तत्कालता को हटाने से बचाना चाहता हूं (लाभ के लिए ऊपर देखें)।
namespace Loki
{
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
}
#define LOKI_STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template <typename T>
class foo
{
public:
void func() {}
void func1() { LOKI_STATIC_CHECK(sizeof(T) == 4, Assertion_error); }
};
template foo<int>;
//template foo<double>; // [1]
int main()
{
foo<int> a;
a.func1();
foo<double> b;
//b.func1(); //[2]
return 0;
}
यह वर्णन से स्पष्ट नहीं है कि समस्या क्या है, लेकिन समस्या के दायरे से ऐसा लगता है कि enable_if आपके लिए है (http://www.boost.org/doc/libs/1_48_0/libs/utility/ enable_if.html) – bobah
@ बोबाः यह बिल्कुल बुरा विचार नहीं है ... मैं इसे देख लूंगा। यदि आप एक साधारण उदाहरण तैयार कर सकते हैं जिसे मैं सत्यापित कर सकता हूं, तो मैं इसे उत्तर के रूप में चिह्नित करूंगा? – Samaursa
मैं उन लोगों से सहमत हूं जो विवरण की कमी के बारे में शिकायत करते हैं। लेकिन वैसे भी, यह मेरे लिए एक घंटी बजती है: "समस्या यह है कि स्थिर दावे हमेशा निकाल दिए जाते हैं"। http://www.boost.org/doc/libs/1_48_0/doc/html/boost_staticassert.html#boost_staticassert.templates, अंतिम टिप्पणी: क्या यह समस्या आपके पास है? –