<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Concepts on kenji.blog</title><link>http://kenji.blog/hi/tags/concepts/</link><description>Recent content in Concepts on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 14:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/concepts/index.xml" rel="self" type="application/rss+xml"/><item><title>C++ टेंप्लेट मेटाप्रोग्रामिंग में कंपाइल-टाइम गणना (Compile-time Computation)</title><link>http://kenji.blog/hi/p/cpp-template-metaprogramming-compile-time-computation/</link><pubDate>Sat, 12 Sep 2026 14:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/cpp-template-metaprogramming-compile-time-computation/</guid><description>&lt;img src="http://kenji.blog/p/cpp-template-metaprogramming-compile-time-computation/img/eyecatch.jpg" alt="Featured image of post C++ टेंप्लेट मेटाप्रोग्रामिंग में कंपाइल-टाइम गणना (Compile-time Computation)" />&lt;p>C++ भाषा का सबसे बड़ा आकर्षण और साथ ही इसका सबसे चुनौतीपूर्ण हिस्सा &amp;ldquo;टेंप्लेट मेटाप्रोग्रामिंग (Template Metaprogramming: TMP)&amp;rdquo; है। यह एक ऐसी तकनीक है जहाँ प्रोग्राम के रन-टाइम (Run-time) पर की जाने वाली गणनाओं को कंपाइल-टाइम (Compile-time) पर पहले ही कर लिया जाता है, जब कंपाइलर सोर्स कोड की व्याख्या करके बाइनरी उत्पन्न करता है।&lt;/p>
&lt;p>इस लेख में, हम अत्यंत विस्तार से यह चर्चा करेंगे कि कैसे C++ टेंप्लेट्स ने मूल रूप से गणना क्षमताओं को प्राप्त किया, इसकी ऐतिहासिक पृष्ठभूमि से लेकर क्लासिक SFINAE, आधुनिक &lt;code>constexpr&lt;/code>, &lt;code>if constexpr&lt;/code>, और यहाँ तक कि C++20 में &lt;code>consteval&lt;/code> और Concepts (कांसेप्ट्स) के विकास तक, व्यावहारिक कोड उदाहरणों और गणितीय पृष्ठभूमि के साथ।&lt;/p>
&lt;hr>
&lt;h2 id="1-टपलट-मटपरगरमग-क-सबह-टयरग-परणत-turing-completeness-क-आकसमक-खज">1. टेंप्लेट मेटाप्रोग्रामिंग की सुबह: ट्यूरिंग-पूर्णता (Turing Completeness) की आकस्मिक खोज
&lt;/h2>&lt;h3 id="11-टयरग-परणत-कय-ह">1.1 ट्यूरिंग-पूर्णता क्या है?
&lt;/h3>&lt;p>कंप्यूटर विज्ञान में, &amp;ldquo;ट्यूरिंग पूर्ण (Turing Complete)&amp;rdquo; होने का अर्थ है कि इसमें एक सार्वभौमिक ट्यूरिंग मशीन के समान कम्प्यूटेशनल क्षमता है। सरल शब्दों में, यह एक ऐसी प्रणाली है जो &amp;ldquo;सशर्त शाखाकरण (Conditional branching)&amp;rdquo; और &amp;ldquo;अनंत लूप (या रिकर्सन/Recursion)&amp;rdquo; को व्यक्त कर सकती है, और किसी भी मनमाने एल्गोरिदम का वर्णन और निष्पादन कर सकती है।&lt;/p>
&lt;h3 id="12-एरवन-अनरह-erwin-unruh-क-खज">1.2 एरविन अनरुह (Erwin Unruh) की खोज
&lt;/h3>&lt;p>1994 में, C++ मानकीकरण समिति (C++ Standardization Committee) की बैठक में, एरविन अनरुह (Erwin Unruh) नामक व्यक्ति ने कुछ C++ कोड प्रस्तुत किया। वह कोड कंपाइल होने में विफल हो रहा था, लेकिन आश्चर्यजनक रूप से, &lt;strong>कंपाइलर द्वारा आउटपुट किए गए एरर मैसेज में अभाज्य संख्याओं (Prime numbers) का एक क्रम शामिल था&lt;/strong>।&lt;/p>
&lt;p>कंपाइलर टेंप्लेट इंस्टेंशिएशन (Template Instantiation) की प्रक्रिया के दौरान रिकर्सिव प्रोसेसिंग कर रहा था, और इसके गणना परिणाम को एरर मैसेज के रूप में आउटपुट कर रहा था। दूसरे शब्दों में, यह वह क्षण था जब यह सिद्ध हो गया कि C++ की टेंप्लेट कार्यक्षमता में एक &lt;strong>ट्यूरिंग-पूर्ण कम्प्यूटेशनल प्रणाली (Turing-complete computational system)&lt;/strong> अंतर्निहित है, जिसका इरादा भाषा के निर्माता बर्ने स्ट्रॉस्ट्रुप (Bjarne Stroustrup) ने भी नहीं किया था।&lt;/p>
&lt;hr>
&lt;h2 id="2-कलसक-टपलट-मटपरगरमग-c98--c03">2. क्लासिक टेंप्लेट मेटाप्रोग्रामिंग (C++98 / C++03)
&lt;/h2>&lt;p>प्रारंभिक टेंप्लेट मेटाप्रोग्रामिंग शुद्ध कार्यात्मक प्रोग्रामिंग (Functional programming) की शैली को अपनाता था, जिसमें संरचनाओं (&lt;code>struct&lt;/code>) और टेंप्लेट विशेषीकरण (Template Specialization) का उपयोग किया जाता था।&lt;/p>
&lt;h3 id="21-फकटरयल-factorial-क-गणन">2.1 फैक्टोरियल (Factorial) की गणना
&lt;/h3>&lt;p>आइए सबसे बुनियादी उदाहरण देखें, जो कि फैक्टोरियल ($N!$) की गणना है। गणितीय रूप से इसे इस प्रकार परिभाषित किया गया है:&lt;/p>
$$
N! =
\begin{cases}
1 &amp; (N = 0) \\
N \times (N - 1)! &amp; (N > 0)
\end{cases}
$$&lt;p>इसे C++98 टेंप्लेट्स में निम्नलिखित रूप में लिखा जाता है:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// प्राइमरी टेंप्लेट (रिकर्सन का सामान्य मामला)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Factorial&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">Factorial&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">N&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// टेंप्लेट का स्पष्ट विशेषीकरण (रिकर्सन का आधार मामला)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Factorial&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// कंपाइल समय पर गणना की जाती है, और एक स्थिरांक के रूप में एम्बेड की जाती है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;5! = &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">Factorial&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">value&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यहाँ महत्वपूर्ण बात यह है कि &lt;code>Factorial&amp;lt;5&amp;gt;::value&lt;/code> की गणना रन-टाइम पर नहीं की जाती है, बल्कि इसे कंपाइल-टाइम पर विस्तारित किया जाता है, और अंतिम बाइनरी में &lt;code>std::cout &amp;lt;&amp;lt; &amp;quot;5! = &amp;quot; &amp;lt;&amp;lt; 120 &amp;lt;&amp;lt; std::endl;&lt;/code> के समतुल्य कोड उत्पन्न होता है। यह रन-टाइम ओवरहेड को शून्य कर देता है।&lt;/p>
&lt;h3 id="22-फबनच-अनकरम-fibonacci-sequence-और-समय-जटलत-time-complexity">2.2 फिबोनाची अनुक्रम (Fibonacci Sequence) और समय जटिलता (Time Complexity)
&lt;/h3>&lt;p>इसके बाद, आइए फिबोनाची अनुक्रम की गणना करें। पुनरावृत्ति संबंध (Recurrence relation) इस प्रकार है:&lt;/p>
$$
F_n = F_{n-1} + F_{n-2} \quad (F_0 = 0, F_1 = 1)
$$&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Fib&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Fib&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">N&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">Fib&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">N&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Fib&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">static&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Fib&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">static&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यदि इस कार्यान्वयन को रन-टाइम रिकर्सिव फ़ंक्शन के रूप में लिखा जाता, तो यह एक ही गणना को बार-बार दोहराता, जिससे समय जटिलता घातीय समय (Exponential time) $O(2^N)$ हो जाती। हालाँकि, &lt;strong>कंपाइल-टाइम टेंप्लेट इंस्टेंशिएशन में, यह गुण होता है कि समान टेंप्लेट तर्कों वाले प्रकार को केवल एक बार इंस्टेंशिएट किया जाता है&lt;/strong> (मेमोइजेशन/Memoization के समान प्रभाव)। इसलिए, कंपाइल-टाइम गणना जटिलता प्रभावी रूप से $O(N)$ हो जाती है।&lt;/p>
&lt;p>नीचे दिया गया चित्र दर्शाता है कि कंपाइलर इंस्टेंसेस (instances) को कैसे हल करता है।&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Fib&amp;lt;4&amp;gt;&amp;#34;] --&amp;gt; B[&amp;#34;Fib&amp;lt;3&amp;gt;&amp;#34;]
A[&amp;#34;Fib&amp;lt;4&amp;gt;&amp;#34;] --&amp;gt; C[&amp;#34;Fib&amp;lt;2&amp;gt;&amp;#34;]
B[&amp;#34;Fib&amp;lt;3&amp;gt;&amp;#34;] --&amp;gt; D[&amp;#34;Fib&amp;lt;2&amp;gt;&amp;#34;]
B[&amp;#34;Fib&amp;lt;3&amp;gt;&amp;#34;] --&amp;gt; E[&amp;#34;Fib&amp;lt;1&amp;gt;&amp;#34;]
C[&amp;#34;Fib&amp;lt;2&amp;gt;&amp;#34;] --&amp;gt; F[&amp;#34;Fib&amp;lt;1&amp;gt;&amp;#34;]
C[&amp;#34;Fib&amp;lt;2&amp;gt;&amp;#34;] --&amp;gt; G[&amp;#34;Fib&amp;lt;0&amp;gt;&amp;#34;]
style D fill:#f9f,stroke:#333,stroke-width:2px
style C fill:#f9f,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>उपरोक्त चित्र में, एक ही रंग और आकार वाले &lt;code>Fib&amp;lt;2&amp;gt;&lt;/code> को कंपाइलर के भीतर केवल एक बार इंस्टेंशिएट किया जाता है, और दूसरी बार से कैश किए गए प्रकार की परिभाषा (cached type definition) का उपयोग किया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="3-sfinae-और-type-traits-c11">3. SFINAE और Type Traits (C++11)
&lt;/h2>&lt;p>जैसे-जैसे मेटाप्रोग्रामिंग विकसित हुई, न केवल &amp;ldquo;मानों की गणना&amp;rdquo; बल्कि &amp;ldquo;प्रकारों के हेरफेर और निर्धारण (Type manipulation and determination)&amp;rdquo; को भी महत्वपूर्ण माना जाने लगा। यहीं पर &lt;strong>SFINAE&lt;/strong> (Substitution Failure Is Not An Error: प्रतिस्थापन विफलता एक त्रुटि नहीं है) सामने आता है।&lt;/p>
&lt;h3 id="31-sfinae-क-ततर">3.1 SFINAE का तंत्र
&lt;/h3>&lt;p>टेंप्लेट फ़ंक्शन ओवरलोड रिज़ॉल्यूशन के दौरान, कंपाइलर पास किए गए तर्कों से टेंप्लेट तर्कों का अनुमान लगाता है और सिग्नेचर (फ़ंक्शन का घोषणा भाग) के प्रकार को प्रतिस्थापित करता है। इस समय, यदि कोई प्रकार की विसंगति होती है और प्रतिस्थापन विफल हो जाता है, तो कंपाइलर तुरंत संकलन त्रुटि (compile error) नहीं देता है, बल्कि &lt;strong>चुपचाप उस ओवरलोड उम्मीदवार को बाहर कर देता है&lt;/strong> और अगले उम्मीदवार की तलाश करता है।&lt;/p>
&lt;pre class="mermaid">
stateDiagram-v2
[*] --&amp;gt; A
A[&amp;#34;टेंप्लेट फ़ंक्शन कॉल&amp;#34;] --&amp;gt; B[&amp;#34;प्रकार अनुमान&amp;#34;]
B[&amp;#34;प्रकार अनुमान&amp;#34;] --&amp;gt; C[&amp;#34;सिग्नेचर प्रतिस्थापन&amp;#34;]
C[&amp;#34;सिग्नेचर प्रतिस्थापन&amp;#34;] --&amp;gt; D[&amp;#34;प्रतिस्थापन सफल?&amp;#34;]
D[&amp;#34;प्रतिस्थापन सफल?&amp;#34;] --&amp;gt; E[&amp;#34;उम्मीदवारों में जोड़ें&amp;#34;] : Yes
D[&amp;#34;प्रतिस्थापन सफल?&amp;#34;] --&amp;gt; F[&amp;#34;त्रुटि के बजाय उम्मीदवारों से बाहर करें (SFINAE)&amp;#34;] : No
E[&amp;#34;उम्मीदवारों में जोड़ें&amp;#34;] --&amp;gt; G[&amp;#34;ओवरलोड रिज़ॉल्यूशन&amp;#34;]
F[&amp;#34;त्रुटि के बजाय उम्मीदवारों से बाहर करें (SFINAE)&amp;#34;] --&amp;gt; G[&amp;#34;ओवरलोड रिज़ॉल्यूशन&amp;#34;]
G[&amp;#34;ओवरलोड रिज़ॉल्यूशन&amp;#34;] --&amp;gt; [*]
&lt;/pre>
&lt;h3 id="32-stdenable_if-क-उपयग-करक-सशरत-सकलन-conditional-compilation">3.2 std::enable_if का उपयोग करके सशर्त संकलन (Conditional Compilation)
&lt;/h3>&lt;p>C++11 में पेश किए गए &lt;code>&amp;lt;type_traits&amp;gt;&lt;/code> हेडर और &lt;code>std::enable_if&lt;/code> का उपयोग करके, फ़ंक्शंस को केवल उन प्रकारों के लिए सक्षम किया जा सकता है जो विशिष्ट शर्तों को पूरा करते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;type_traits&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ओवरलोड जो केवल तभी सक्षम होता है जब T एक पूर्णांक प्रकार हो
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="k">typename&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typename&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">enable_if&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">is_integral&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">print_type&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Integer: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ओवरलोड जो केवल तभी सक्षम होता है जब T एक फ्लोटिंग-पॉइंट प्रकार हो
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="k">typename&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typename&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">enable_if&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">is_floating_point&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="o">&amp;gt;::&lt;/span>&lt;span class="n">type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">print_type&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Floating point: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">print_type&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">42&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Integer: 42
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">print_type&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">3.1415&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Floating point: 3.1415
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// print_type(&amp;#34;str&amp;#34;); // संकलन त्रुटि: मेल खाने वाला कोई फ़ंक्शन नहीं है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यह दृष्टिकोण बहुत शक्तिशाली था, लेकिन &lt;code>typename std::enable_if&amp;lt;...&amp;gt;::type&lt;/code> जैसे विवरण अत्यधिक वर्बोज़ (verbose) थे, जिसने लोगों को यह सोचने पर मजबूर कर दिया कि &amp;ldquo;C++ मेटाप्रोग्रामिंग एक गुप्त कोड की तरह है&amp;rdquo; और इससे बचने का एक कारण बन गया।&lt;/p>
&lt;hr>
&lt;h2 id="4-परतमन-बदलव-paradigm-shift-constexpr-क-परचय-c11c14">4. प्रतिमान बदलाव (Paradigm Shift): constexpr का परिचय (C++11/C++14)
&lt;/h2>&lt;p>C++11 ने &lt;code>constexpr&lt;/code> कीवर्ड पेश किया, जिसे मेटाप्रोग्रामिंग के इतिहास में एक क्रांति कहा जा सकता है। इसने अप्राकृतिक टेंप्लेट रिकर्सन का उपयोग किए बिना, &lt;strong>सामान्य फ़ंक्शंस को लिखकर कंपाइल-टाइम गणना&lt;/strong> को संभव बना दिया।&lt;/p>
&lt;h3 id="41-c11-क-constexpr">4.1 C++11 का constexpr
&lt;/h3>&lt;p>C++11 के समय &lt;code>constexpr&lt;/code> फ़ंक्शंस पर एक सख्त प्रतिबंध था कि &amp;ldquo;फ़ंक्शन का मुख्य भाग केवल एक &lt;code>return&lt;/code> स्टेटमेंट से बना होना चाहिए&amp;rdquo;। इसलिए, लूप का उपयोग करना संभव नहीं था, और टर्नरी ऑपरेटरों (ternary operators) और रिकर्सन पर निर्भर रहना आवश्यक था।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// C++11 का constexpr फिबोनाची
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">constexpr&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="nf">fib_cxx11&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nl">n&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">fib_cxx11&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">fib_cxx11&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="42-c14-म-constexpr-म-छट">4.2 C++14 में constexpr में छूट
&lt;/h3>&lt;p>C++14 में, इस प्रतिबंध में काफी ढील दी गई थी, और &lt;code>constexpr&lt;/code> फ़ंक्शंस के भीतर स्थानीय चर घोषणाओं (local variable declarations), &lt;code>if&lt;/code> स्टेटमेंट, &lt;code>for&lt;/code> लूप आदि का उपयोग करना संभव हो गया। यह आपको रन-टाइम की तरह ही सरलता से एल्गोरिदम लिखने की अनुमति देता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// C++14 का constexpr फिबोनाची
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">constexpr&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="nf">fib_cxx14&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस कोड की गणना कंपाइल-टाइम पर की जाती है यदि इसका मूल्यांकन कंपाइल-टाइम पर किया जा सकता है, और यदि तर्क रन-टाइम पर पारित किए जाते हैं, तो इसकी गणना रन-टाइम पर एक सामान्य फ़ंक्शन के रूप में की जाती है।&lt;/p>
&lt;pre class="mermaid">
graph TD
subgraph &amp;#34;कंपाइल समय (Compile Time)&amp;#34;
A[&amp;#34;सोर्स कोड विश्लेषण&amp;#34;] --&amp;gt; B[&amp;#34;AST निर्माण&amp;#34;]
B[&amp;#34;AST निर्माण&amp;#34;] --&amp;gt; C[&amp;#34;constexpr फ़ंक्शन का मूल्यांकन&amp;#34;]
C[&amp;#34;constexpr फ़ंक्शन का मूल्यांकन&amp;#34;] --&amp;gt; D[&amp;#34;स्थिरांक एम्बेड करना (जैसे 120)&amp;#34;]
end
subgraph &amp;#34;रन समय (Runtime)&amp;#34;
E[&amp;#34;प्रोग्राम स्टार्ट&amp;#34;] --&amp;gt; F[&amp;#34;पूर्व-गणित परिणामों का सीधा उपयोग&amp;#34;]
F[&amp;#34;पूर्व-गणित परिणामों का सीधा उपयोग&amp;#34;] --&amp;gt; G[&amp;#34;शून्य गणना लागत निष्पादन&amp;#34;]
end
D[&amp;#34;स्थिरांक एम्बेड करना (जैसे 120)&amp;#34;] --&amp;gt; E[&amp;#34;प्रोग्राम स्टार्ट&amp;#34;]
&lt;/pre>
&lt;hr>
&lt;h2 id="5-सथतक-सशरत-शखकरण-static-conditional-branching-म-महरत-हसल-करन-if-constexpr-c17">5. स्थैतिक सशर्त शाखाकरण (Static Conditional Branching) में महारत हासिल करना: if constexpr (C++17)
&lt;/h2>&lt;p>C++17 ने &lt;code>if constexpr&lt;/code> पेश किया, जो SFINAE का उपयोग करते हुए वर्बोज़ ओवरलोड रिज़ॉल्यूशन को अतीत की बात बना देता है। यह एक &lt;code>if&lt;/code> स्टेटमेंट है जिसका मूल्यांकन कंपाइल-टाइम पर किया जाता है, और जिस ब्लॉक की स्थिति &lt;code>false&lt;/code> हो जाती है, उसे इंस्टेंशिएट भी नहीं किया जाता है और संकलन लक्ष्य (compilation target) से पूरी तरह से हटा दिया जाता है।&lt;/p>
&lt;p>यदि हम पिछले SFINAE उदाहरण को &lt;code>if constexpr&lt;/code> के साथ फिर से लिखते हैं, तो यह आश्चर्यजनक रूप से सरल हो जाता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;type_traits&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="k">typename&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="n">print_type&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span> &lt;span class="n">val&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nf">constexpr&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">is_integral_v&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Integer: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="nf">constexpr&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">is_floating_point_v&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Floating point: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">val&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Other type&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>if constexpr&lt;/code> का उपयोग करके, विभिन्न प्रकारों के लिए प्रसंस्करण को एक ही टेंप्लेट फ़ंक्शन में समूहीकृत किया जा सकता है, जिससे कोड की पठनीयता (readability) में काफी सुधार होता है।&lt;/p>
&lt;hr>
&lt;h2 id="6-आधनक-c-क-सचच-सर-consteval-और-concepts-c20">6. आधुनिक C++ का सच्चा सार: consteval और Concepts (C++20)
&lt;/h2>&lt;p>C++20, C++11 के बाद से सबसे बड़ा अपडेट था। मेटाप्रोग्रामिंग के क्षेत्र में भी इसमें नाटकीय रूप से विकास हुआ है।&lt;/p>
&lt;h3 id="61-हमश-कपइल-टइम-पर-गणन-कर-consteval">6.1 हमेशा कंपाइल-टाइम पर गणना करें: consteval
&lt;/h3>&lt;p>&lt;code>constexpr&lt;/code> एक निर्देश था जो कहता था &amp;ldquo;यदि शर्तें पूरी होती हैं तो कंपाइल-टाइम पर गणना करें&amp;rdquo;, लेकिन इसे रन-टाइम पर भी मूल्यांकन करने की अनुमति है। दूसरी ओर, C++20 में जोड़ा गया &lt;code>consteval&lt;/code>, &lt;strong>&amp;ldquo;तात्कालिक फ़ंक्शंस (Immediate Functions)&amp;rdquo;&lt;/strong> को परिभाषित करता है जिन्हें &lt;strong>अवश्य ही कंपाइल-टाइम पर मूल्यांकित किया जाना चाहिए&lt;/strong>। यदि आप रन-टाइम पर इसका मूल्यांकन करने का प्रयास करते हैं, तो इसके परिणामस्वरूप संकलन त्रुटि (compile error) होगी।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// स्पष्ट रूप से कंपाइल-टाइम गणना को बाध्य करता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">consteval&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="nf">square&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">constexpr&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">square&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// OK: कंपाइल-टाइम मूल्यांकन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// int b = square(x); // त्रुटि: x एक रन-टाइम चर है, इसलिए इसका मूल्यांकन नहीं किया जा सकता
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-टपलट-आवशयकतओ-क-सपषट-करन-concepts">6.2 टेंप्लेट आवश्यकताओं को स्पष्ट करना: Concepts
&lt;/h3>&lt;p>मेटाप्रोग्रामिंग की सबसे बड़ी कमजोरियों में से एक &amp;ldquo;त्रुटि संदेशों की जटिलता&amp;rdquo; थी। टेंप्लेट तर्क में गलत प्रकार पास करने पर कभी-कभी सैकड़ों पंक्तियों के अर्थहीन त्रुटि संदेश आ सकते थे।&lt;/p>
&lt;p>C++20 के &lt;strong>Concepts (कांसेप्ट्स)&lt;/strong> का उपयोग करके, टेंप्लेट्स द्वारा स्वीकार किए गए प्रकारों पर प्रतिबंध प्राकृतिक भाषा के करीब एक रूप में स्पष्ट रूप से बताए जा सकते हैं, और त्रुटि संदेश बहुत स्पष्ट हो जाते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;concepts&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// यह आवश्यकता है कि T एक पूर्णांक प्रकार होना चाहिए
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">template&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">integral&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">T&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// OK
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// std::cout &amp;lt;&amp;lt; add(1.5, 2.5) &amp;lt;&amp;lt; std::endl; // त्रुटि: std::integral को पूरा नहीं करता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-वयवहरक-उदहरण-कपइल-टइम-अभजय-सखय-परकषण-prime-number-testing-और-एलगरदम-अनकलन">7. व्यावहारिक उदाहरण: कंपाइल-टाइम अभाज्य संख्या परीक्षण (Prime Number Testing) और एल्गोरिदम अनुकूलन
&lt;/h2>&lt;p>आइए अब तक प्राप्त ज्ञान को लागू करें और कंपाइल-टाइम पर अभाज्य संख्याओं का परीक्षण करने के लिए एक कोड लिखें। यहाँ, हम आधुनिक C++20 सुविधा (&lt;code>consteval&lt;/code>) का उपयोग करते हैं।&lt;/p>
&lt;p>अभाज्य संख्या परीक्षण एल्गोरिदम की समय जटिलता भोलेपन से जाँचने पर $O(N)$ है, लेकिन चूंकि $\sqrt{N}$ तक जाँचना पर्याप्त है, एक इष्टतम एल्गोरिदम की जटिलता $O(\sqrt{N})$ होती है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// कंपाइल-टाइम पर वर्गमूल के पूर्णांक भाग की गणना करने के लिए हेल्पर फ़ंक्शन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">consteval&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="nf">compile_time_sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">res&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">res&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// C++20 consteval का उपयोग करके अभाज्य संख्या परीक्षण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">consteval&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="nf">is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">limit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">compile_time_sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">limit&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// पूरी तरह से कंपाइल-टाइम पर मूल्यांकन किया गया
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">static_assert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">104729&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;104729 should be prime!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static_assert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;100 should not be prime!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">constexpr&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">is_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9973&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Is 9973 prime? &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">boolalpha&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>उपरोक्त कोड में, चूँकि &lt;code>compile_time_sqrt&lt;/code> और &lt;code>is_prime&lt;/code> दोनों को &lt;code>consteval&lt;/code> के रूप में निर्दिष्ट किया गया है, ये गणनाएँ कंपाइल-टाइम पर 100% पूरी हो जाती हैं। निष्पादन योग्य फ़ाइल (executable file) की बाइनरी में बस स्थिरांक (बूलियन मान) &lt;code>true&lt;/code> या &lt;code>false&lt;/code> एम्बेड होते हैं।&lt;/p>
&lt;h3 id="71-जटलत-क-गणतय-अभवयकत">7.1 जटिलता की गणितीय अभिव्यक्ति
&lt;/h3>&lt;p>अभाज्य संख्या परीक्षण में, परीक्षण किया जाने वाला अधिकतम मान $\lfloor \sqrt{N} \rfloor$ है।
इसलिए, सबसे खराब स्थिति का निष्पादन समय (worst-case execution time) $T(N)$ इस प्रकार है:&lt;/p>
$$
T(N) = O(\sqrt{N})
$$&lt;p>यदि रन-टाइम पर इसकी गणना की जाती है, तो यह कुछ सौ मिलीसेकंड से लेकर कुछ सेकंड तक की देरी का कारण बन सकता है, उदाहरण के लिए क्रिप्टोग्राफ़िक प्रसंस्करण या बड़े पैमाने पर सिमुलेशन आरंभीकरण (initialization) में। हालाँकि, यदि कंपाइल-टाइम मेटाप्रोग्रामिंग का उपयोग किया जाता है, तो इस $T(N)$ की लागत पूरी तरह से कंपाइलर द्वारा वहन की जाती है, और उपयोगकर्ता के लिए रन-टाइम लागत $O(1)$ हो जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="8-कपइल-टइम-गणन-क-परकश-और-छय">8. कंपाइल-टाइम गणना का प्रकाश और छाया
&lt;/h2>&lt;p>अब तक, हमने C++ की शक्तिशाली कंपाइल-टाइम गणना क्षमताओं को देखा है, लेकिन इनका उपयोग बिना किसी शर्त के बहुतायत में नहीं किया जाना चाहिए।&lt;/p>
&lt;h3 id="लभ-merits">लाभ (Merits)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>जीरो रन-टाइम ओवरहेड&lt;/strong>: चूँकि गणना परिणाम स्थिरांक बन जाते हैं, निष्पादन की गति सबसे तेज़ होती है।&lt;/li>
&lt;li>&lt;strong>बग की शीघ्र खोज&lt;/strong>: &lt;code>static_assert&lt;/code> और अन्य के साथ संयोजन करके, तार्किक विफलताओं और प्रकार की विसंगतियों को संकलन के समय मज़बूती से पकड़ा जा सकता है।&lt;/li>
&lt;/ul>
&lt;h3 id="नकसन-demerits">नुकसान (Demerits)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>बिल्ड समय का विस्फोट&lt;/strong>: कंपाइलर के भीतर गणना एक समर्पित दुभाषिया वातावरण (कंपाइलर के AST मूल्यांकनकर्ता) में की जाती है, जो रन-टाइम पर मूल कोड निष्पादित करने की तुलना में बहुत धीमी है। यदि आप कंपाइल-टाइम पर विशाल मैट्रिक्स गणनाएँ करते हैं, तो बिल्ड समय घंटों तक बढ़ने का जोखिम होता है।&lt;/li>
&lt;li>&lt;strong>बाइनरी ब्लोट (Binary Bloat)&lt;/strong>: यदि टेंप्लेट को कई अलग-अलग प्रकारों के साथ इंस्टेंशिएट किया जाता है, तो बड़ी संख्या में फ़ंक्शंस उत्पन्न होते हैं, जिससे निष्पादन योग्य फ़ाइल का आकार बढ़ सकता है (Code Bloat)।&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="9-नषकरष">9. निष्कर्ष
&lt;/h2>&lt;p>C++ टेंप्लेट मेटाप्रोग्रामिंग एक &amp;ldquo;आकस्मिक खोज (हैक)&amp;rdquo; के रूप में शुरू हुई जहाँ एक त्रुटि संदेश से अभाज्य संख्याएँ आउटपुट हुई थीं, और वर्षों के मानकीकरण के काम के माध्यम से, यह परिष्कृत भाषा सुविधाओं (&lt;code>constexpr&lt;/code>, &lt;code>if constexpr&lt;/code>, &lt;code>Concepts&lt;/code>) में विकसित हुई है।&lt;/p>
&lt;p>आधुनिक C++ में, &amp;ldquo;मेटाप्रोग्रामिंग&amp;rdquo; की बाधा नाटकीय रूप से कम हो गई है, और आप सामान्य कार्यक्रमों की तरह सहज ज्ञान युक्त कोड (intuitive code) लिखते हुए कंपाइल-टाइम गणनाओं का लाभ उठा सकते हैं।&lt;/p>
&lt;p>एम्बेडेड सिस्टम (embedded systems), गेम इंजन, और उच्च-आवृत्ति ट्रेडिंग (HFT) सिस्टम में जहाँ परम प्रदर्शन (ultimate performance) की आवश्यकता होती है, यह तकनीक भविष्य में भी গান্ধर्वीय उपकरण बनी रहेगी।&lt;/p>
&lt;p>C++ का विकास अभी रुका नहीं है। आगामी मानकों, C++23 और C++26 में कंपाइल-टाइम रिफ्लेक्शन (compile-time reflection) जैसी और भी अधिक शक्तिशाली सुविधाएँ क्षितिज पर हैं। हम आशा करते हैं कि आप आधुनिक टेंप्लेट प्रोग्रामिंग में महारत हासिल करेंगे और सीमाओं से परे अनुकूलन (optimization) की दुनिया का आनंद लेंगे।&lt;/p></description></item></channel></rss>