<div dir="ltr">I had mistakenly used std::enable_if_t instead of conditional_t and I promise to fix this mistake soon</div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Sun, Apr 19, 2026 at 3:17 PM Muneem &lt;<a href="mailto:itfllow123@gmail.com">itfllow123@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I am really sorry for sending many emails at once but I had mistakenly used size_t instead of std::size_t. I just wanted to fix it.<div>this is the github link:<a href="https://github.com/HjaldrKhilji/Future-potential-ISO-porposals/blob/main/Runtime_Indexed_Tuples_Proposal_Official%20(1).docx" target="_blank">https://github.com/HjaldrKhilji/Future-potential-ISO-porposals/blob/main/Runtime_Indexed_Tuples_Proposal_Official%20(1).docx</a>  (in case your email client cant see the linked file)</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Apr 19, 2026 at 2:27 PM Muneem &lt;<a href="mailto:itfllow123@gmail.com" target="_blank">itfllow123@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I also updated my proposal to include this example. If anyone has any issues with it, please tell me, and I will answer everyone tomorrow and also all the other questions that I haven&#39;t answered yet.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Apr 19, 2026 at 1:46 PM Muneem &lt;<a href="mailto:itfllow123@gmail.com" target="_blank">itfllow123@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">The previous code that I posted worked on visual studio 2026, but couldnt on gdb online debugger, but here version that works on gdb as well:<br><div><a href="https://onlinegdb.com/IBsomUfmPI" target="_blank">https://onlinegdb.com/IBsomUfmPI</a></div><div>#include &lt;iostream&gt;<br>#include &lt;type_traits&gt;<br>#include &lt;variant&gt;<br>#include &lt;functional&gt;<br>#include &lt;array&gt;<br>template&lt;typename Head, typename ... Types&gt;<br>struct tuple_impl :tuple_impl&lt;Types...&gt;<br>{<br>    Head head;<br>    tuple_impl(Head&amp;&amp; a, Types... types) : tuple_impl&lt;Types...&gt;(types...), head{ a } {}<br>    tuple_impl(Head&amp; a, Types... types)  : tuple_impl&lt;Types...&gt;(types...), head{ a } {}<br>};<br>template&lt;typename Head&gt;<br>struct tuple_impl&lt;Head&gt; {<br>    Head head;<br>    tuple_impl(Head&amp;&amp; a) : head{ a } {}<br>    tuple_impl(Head&amp; a) :  head{ a } {}<br>};<br><br>template&lt;typename T, typename Head_t&gt;<br>const constexpr bool Is_unique() { // requires() couldnt work here for overloading<br>    return true;<br>}<br><br>template&lt;typename T, typename Head_t, typename... Tail&gt;<br>const constexpr std::enable_if_t &lt; (sizeof...(Tail) &gt; 0), bool &gt; Is_unique() {<br>    return <br>        !((std::is_same_v&lt;T, Head_t&gt;) &amp;&amp; (Is_unique&lt;T, Tail...&gt;()))<br>        &amp;&amp;<br>        ((std::is_same_v&lt;T, Head_t&gt;) || (Is_unique&lt;T, Tail...&gt;()));<br>}<br><br><br>template&lt;typename Head_t, typename ... Types &gt;<br>constexpr bool is_unique_from_after_on() {<br>    return Is_unique&lt;Head_t, Types...&gt;();<br>};<br>template&lt;typename Head_t&gt;<br>constexpr bool is_unique_from_after_on() {<br>    return true;<br>}<br><br><br><br>template&lt;typename Head, typename ... Types&gt;<br>struct tuple:tuple_impl&lt;Types&gt;... {<br>    Head head;<br><br>    using complex_elem = std::variant &lt;<br>        std::enable_if_t&lt;<br>        is_unique_from_after_on&lt;Head, Types...&gt;(), Head*<br>        &gt;,<br>        std::enable_if_t &lt;<br>        is_unique_from_after_on&lt;Types...&gt;(), Types*<br>        &gt;...<br>        &gt;;<br>    std::array&lt;complex_elem, (sizeof...(Types))+1&gt; book_keeper;<br>    template&lt;typename Head_, typename ... Types_&gt;<br>    constexpr tuple(Head_&amp;&amp; a, Types_&amp;&amp;... b ) :head{ std::forward&lt;Head&gt;(a) }, tuple_impl&lt;Types&gt;{std::forward&lt;Types&gt;(b)}...,<br>        book_keeper{<br>        &amp;head, &amp;(this-&gt;tuple_impl&lt;Types&gt;::head)...} <br>     {<br>    <br>    }<br>    complex_elem operator[](size_t index) {<br>		return book_keeper[index];<br>    }<br>};<br>template&lt;typename Head&gt;<br>struct tuple&lt;Head&gt;{<br>    Head head;<br>    tuple(Head&amp;&amp; a ) : head{ a } {}<br>    tuple(Head&amp; a) :   head{ a } {}<br>    std::variant&lt;Head*&gt; operator[](size_t index) {<br>        return head;<br>    }<br>};<br><br><br><br>int main() {<br>    tuple&lt;int, double, float&gt; list{1, 2.0, 3.0f};<br>    std::cout &lt;&lt; *std::get&lt;0&gt;(list[0]) &lt;&lt; std::endl;<br>    std::cout &lt;&lt; *std::get&lt;1&gt;(list[1]) &lt;&lt; std::endl;<br>    std::cout &lt;&lt; *std::get&lt;2&gt;(list[2]) &lt;&lt; std::endl;<br>    return 0;<br>}<br></div><div><br></div><div>//the reason it didn&#39;t work was template parameter name shadowing, but it still worked in visual studio 2026</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Apr 19, 2026 at 1:01 PM Muneem &lt;<a href="mailto:itfllow123@gmail.com" target="_blank">itfllow123@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Sorry for taking so much time for such a basic implementation, and I won&#39;t be able to answer any questions until tomorrow because I am really tired. I hope that we can continue this discussion tomorrow. I am sorry for being hesitant to give out a proper implementation sooner.</div>This is the example implementation code:<br><pre style="font-family:&quot;Cascadia Mono&quot;;font-size:9pt;color:rgb(0,0,0)"><span style="color:rgb(128,128,128)">#include</span> <span style="color:rgb(163,21,21)">&lt;iostream&gt;</span>
<span style="color:rgb(128,128,128)">#include</span> <span style="color:rgb(163,21,21)">&lt;type_traits&gt;</span>
<span style="color:rgb(128,128,128)">#include</span> <span style="color:rgb(163,21,21)">&lt;variant&gt;</span>
<span style="color:rgb(128,128,128)">#include</span> <span style="color:rgb(163,21,21)">&lt;functional&gt;</span>
<span style="color:rgb(128,128,128)">#include</span> <span style="color:rgb(163,21,21)">&lt;array&gt;</span>
<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head</span>, <span style="color:rgb(0,0,255)">typename</span> ... <span style="color:rgb(43,145,175)">Types</span>&gt;
<span style="color:rgb(0,0,255)">struct</span> <span style="color:rgb(43,145,175)">tuple_impl</span> :<span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Types</span>...&gt;
{
    <span style="color:rgb(43,145,175)">Head</span> head;
    tuple_impl(<span style="color:rgb(43,145,175)">Head</span>&amp;&amp; <span style="color:rgb(128,128,128)">a</span>, <span style="color:rgb(43,145,175)">Types</span>... <span style="color:rgb(128,128,128)">types</span>) : <span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Types</span>...&gt;(<span style="color:rgb(128,128,128)">types</span>...), head{ <span style="color:rgb(128,128,128)">a</span> } {}
    tuple_impl(<span style="color:rgb(43,145,175)">Head</span>&amp; <span style="color:rgb(128,128,128)">a</span>, <span style="color:rgb(43,145,175)">Types</span>... <span style="color:rgb(128,128,128)">types</span>)  : <span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Types</span>...&gt;(<span style="color:rgb(128,128,128)">types</span>...), head{ <span style="color:rgb(128,128,128)">a</span> } {}
};
<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head</span>&gt;
<span style="color:rgb(0,0,255)">struct</span> <span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Head</span>&gt; {
    <span style="color:rgb(43,145,175)">Head</span> head;
    tuple_impl(<span style="color:rgb(43,145,175)">Head</span>&amp;&amp; <span style="color:rgb(128,128,128)">a</span>) : head{ <span style="color:rgb(128,128,128)">a</span> } {}
    tuple_impl(<span style="color:rgb(43,145,175)">Head</span>&amp; <span style="color:rgb(128,128,128)">a</span>) :  head{ <span style="color:rgb(128,128,128)">a</span> } {}
};

<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">T</span>, <span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head_t</span>&gt;
<span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,0,255)">constexpr</span> <span style="color:rgb(0,0,255)">bool</span> Is_unique() { <span style="color:rgb(0,128,0)">// requires() couldnt work here for overloading</span>
    <span style="color:rgb(0,0,255)">return</span> <span style="color:rgb(0,0,255)">true</span>;
}

<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">T</span>, <span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head_t</span>, <span style="color:rgb(0,0,255)">typename</span>... <span style="color:rgb(43,145,175)">Tail</span>&gt;
<span style="color:rgb(0,0,255)">const</span> <span style="color:rgb(0,0,255)">constexpr</span> std::<span style="color:rgb(43,145,175)">enable_if_t</span> &lt; (<span style="color:rgb(0,0,255)">sizeof</span>...(<span style="color:rgb(43,145,175)">Tail</span>) &gt; 0), <span style="color:rgb(0,0,255)">bool</span> &gt; Is_unique() {
    <span style="color:rgb(0,0,255)">return</span> 
        !((std::is_same_v&lt;<span style="color:rgb(43,145,175)">T</span>, <span style="color:rgb(43,145,175)">Head_t</span>&gt;) &amp;&amp; (Is_unique&lt;<span style="color:rgb(43,145,175)">T</span>, <span style="color:rgb(43,145,175)">Tail</span>...&gt;()))
        &amp;&amp;
        ((std::is_same_v&lt;<span style="color:rgb(43,145,175)">T</span>, <span style="color:rgb(43,145,175)">Head_t</span>&gt;) || (Is_unique&lt;<span style="color:rgb(43,145,175)">T</span>, <span style="color:rgb(43,145,175)">Tail</span>...&gt;()));
}


<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head_t</span>, <span style="color:rgb(0,0,255)">typename</span> ... <span style="color:rgb(43,145,175)">Types</span> &gt;
<span style="color:rgb(0,0,255)">constexpr</span> <span style="color:rgb(0,0,255)">bool</span> is_unique_from_after_on() {
    <span style="color:rgb(0,0,255)">return</span> Is_unique&lt;<span style="color:rgb(43,145,175)">Head_t</span>, <span style="color:rgb(43,145,175)">Types</span>...&gt;();
};
<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head_t</span>&gt;
<span style="color:rgb(0,0,255)">constexpr</span> <span style="color:rgb(0,0,255)">bool</span> is_unique_from_after_on() {
    <span style="color:rgb(0,0,255)">return</span> <span style="color:rgb(0,0,255)">true</span>;
}



<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head</span>, <span style="color:rgb(0,0,255)">typename</span> ... <span style="color:rgb(43,145,175)">Types</span>&gt;
<span style="color:rgb(0,0,255)">struct</span> <span style="color:rgb(43,145,175)">tuple</span>:<span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Types</span>&gt;... {
    <span style="color:rgb(43,145,175)">Head</span> head;

    <span style="color:rgb(0,0,255)">using</span> <span style="color:rgb(43,145,175)">complex_elem</span> = std::<span style="color:rgb(43,145,175)">variant</span> &lt;
        std::<span style="color:rgb(43,145,175)">enable_if_t</span>&lt;
        is_unique_from_after_on&lt;<span style="color:rgb(43,145,175)">Head</span>, <span style="color:rgb(43,145,175)">Types</span>...&gt;(), <span style="color:rgb(43,145,175)">Head</span>*
        &gt;,
        std::<span style="color:rgb(43,145,175)">enable_if_t</span> &lt;
        is_unique_from_after_on&lt;<span style="color:rgb(43,145,175)">Types</span>...&gt;(), <span style="color:rgb(43,145,175)">Types</span>*
        &gt;...
        &gt;;
    std::<span style="color:rgb(43,145,175)">array</span>&lt;<span style="color:rgb(43,145,175)">complex_elem</span>, (<span style="color:rgb(0,0,255)">sizeof</span>...(<span style="color:rgb(43,145,175)">Types</span>))+1&gt; book_keeper;
    <span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head</span>, <span style="color:rgb(0,0,255)">typename</span> ... <span style="color:rgb(43,145,175)">Types</span>&gt;
    <span style="color:rgb(0,0,255)">constexpr</span> tuple(<span style="color:rgb(43,145,175)">Head</span>&amp;&amp; <span style="color:rgb(128,128,128)">a</span>, <span style="color:rgb(43,145,175)">Types</span>&amp;&amp;... <span style="color:rgb(128,128,128)">b</span> ) :head{ std::forward&lt;<span style="color:rgb(43,145,175)">Head</span>&gt;(<span style="color:rgb(128,128,128)">a</span>) }, <span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Types</span>&gt;{std::forward&lt;<span style="color:rgb(43,145,175)">Types</span>&gt;(<span style="color:rgb(128,128,128)">b</span>)}...,
        book_keeper{
        &amp;head, &amp;(<span style="color:rgb(0,0,255)">this</span>-&gt;<span style="color:rgb(43,145,175)">tuple_impl</span>&lt;<span style="color:rgb(43,145,175)">Types</span>&gt;::head)...} 
     {
    
    }
    <span style="color:rgb(43,145,175)">complex_elem</span> <span style="color:rgb(0,128,128)">operator[]</span>(<span style="color:rgb(43,145,175)">size_t</span> <span style="color:rgb(128,128,128)">index</span>) {
		<span style="color:rgb(0,0,255)">return</span> book_keeper[<span style="color:rgb(128,128,128)">index</span>];
    }
};
<span style="color:rgb(0,0,255)">template</span>&lt;<span style="color:rgb(0,0,255)">typename</span> <span style="color:rgb(43,145,175)">Head</span>&gt;
<span style="color:rgb(0,0,255)">struct</span> <span style="color:rgb(43,145,175)">tuple</span>&lt;<span style="color:rgb(43,145,175)">Head</span>&gt;{
    <span style="color:rgb(43,145,175)">Head</span> head;
    tuple(<span style="color:rgb(43,145,175)">Head</span>&amp;&amp; <span style="color:rgb(128,128,128)">a</span> ) : head{ <span style="color:rgb(128,128,128)">a</span> } {}
    tuple(<span style="color:rgb(43,145,175)">Head</span>&amp; <span style="color:rgb(128,128,128)">a</span>) :   head{ <span style="color:rgb(128,128,128)">a</span> } {}
    std::<span style="color:rgb(43,145,175)">variant</span>&lt;<span style="color:rgb(43,145,175)">Head</span>*&gt; <span style="color:rgb(0,128,128)">operator[]</span>(<span style="color:rgb(43,145,175)">size_t</span> <span style="color:rgb(128,128,128)">index</span>) {
        <span style="color:rgb(0,0,255)">return</span> head;
    }
};



<span style="color:rgb(0,0,255)">int</span> main() {
    <span style="color:rgb(43,145,175)">tuple</span>&lt;<span style="color:rgb(0,0,255)">int</span>, <span style="color:rgb(0,0,255)">double</span>, <span style="color:rgb(0,0,255)">float</span>&gt; list{1, 2.0, 3.0f};
    std::cout <span style="color:rgb(0,128,128)">&lt;&lt;</span> *std::get&lt;0&gt;(list<span style="color:rgb(0,128,128)">[</span>0<span style="color:rgb(0,128,128)">]</span>) <span style="color:rgb(0,128,128)">&lt;&lt;</span> std::endl;
    std::cout <span style="color:rgb(0,128,128)">&lt;&lt;</span> *std::get&lt;1&gt;(list<span style="color:rgb(0,128,128)">[</span>1<span style="color:rgb(0,128,128)">]</span>) <span style="color:rgb(0,128,128)">&lt;&lt;</span> std::endl;
    std::cout <span style="color:rgb(0,128,128)">&lt;&lt;</span> *std::get&lt;2&gt;(list<span style="color:rgb(0,128,128)">[</span>2<span style="color:rgb(0,128,128)">]</span>) <span style="color:rgb(0,128,128)">&lt;&lt;</span> std::endl;
    <span style="color:rgb(0,0,255)">return</span> 0;
}<br><br><br>
</pre></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Apr 18, 2026 at 9:48 PM Jonathan Wakely via Std-Proposals &lt;<a href="mailto:std-proposals@lists.isocpp.org" target="_blank">std-proposals@lists.isocpp.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 18 Apr 2026, 11:01 Giuseppe D&#39;Angelo via Std-Proposals, &lt;<a href="mailto:std-proposals@lists.isocpp.org" target="_blank">std-proposals@lists.isocpp.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
On 18/04/2026 05:04, Muneem via Std-Proposals wrote:<br>
&gt; I updated my proposal:<a href="https://docs.google.com/document/d/1srd5nKI-" rel="noreferrer noreferrer" target="_blank">https://docs.google.com/document/d/1srd5nKI-</a> <br>
&gt; QZy0vpUdkQoD45JyKIDWhom8/edit? <br>
&gt; usp=sharing&amp;ouid=114869935649093915681&amp;rtpof=true&amp;sd=true &lt;https:// <br>
&gt; <a href="http://docs.google.com/document/d/1srd5nKI-QZy0vpUdkQoD45JyKIDWhom8/edit" rel="noreferrer noreferrer" target="_blank">docs.google.com/document/d/1srd5nKI-QZy0vpUdkQoD45JyKIDWhom8/edit</a>? <br>
&gt; usp=sharing&amp;ouid=114869935649093915681&amp;rtpof=true&amp;sd=true&gt;<br>
&gt; Thank you a lot to everyone for giving their feedback that led me to <br>
&gt; refine my proposal<br>
<br>
First and foremost: this isn&#39;t a proposal. It&#39;s just an abstract idea. A <br>
proposal has to go in detail: discuss tradeoffs, provide a reference <br>
implementation, tentative wording.<br>
<br>
<br>
In 2.1 there&#39;s this claim:<br>
<br>
&gt; Existing tuples cannot be optimized for runtime indexing without breaking the Application Binary Interface (ABI). Furthermore, switch statements are not guaranteed to be the fastest option for tuples with many elements.<br>
<br>
Could you show some data supporting this statement?<br>
<br>
Do you have a prototype implementation where you add such runtime <br>
`get(index)` to an existing std::tuple implementation, as well as a <br>
prototype implementation of the proposed runtime_index_tuple, and show <br>
that the new class brings significant performance gains (... that can&#39;t <br>
otherwise be achieved without breaking std::variant&#39;s ABI)?<br>
<br>
&gt; This proposal introduces a specialization for std::variant&lt;T&amp;...&gt; with the following properties:<br>
&gt; No Valueless State: The variant cannot be valueless by exception.<br>
&gt; Immutable Type Selection: Every std::variant&lt;T&amp;...&gt; is constructed with a reference to a type T that it holds for its entire lifetime.<br>
&gt; Assignment Logic: Assignment modifies the underlying value referred to by the variant rather than changing the active type.<br>
<br>
1) These are extraordinary claims that aren&#39;t backed by extraordinary facts.<br>
<br>
2) Adding support for references in std::variant deserves its own paper. <br>
It&#39;s something that was there originally and then removed by P0510.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">Until this idea has been implemented and tested, this whole thread is a waste of time. </div><div dir="auto"><br></div><div dir="auto">Try to implement it, then come back with a real proposal with numbers to prove the claims. </div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"></blockquote></div></div></div>
-- <br>
Std-Proposals mailing list<br>
<a href="mailto:Std-Proposals@lists.isocpp.org" target="_blank">Std-Proposals@lists.isocpp.org</a><br>
<a href="https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals" rel="noreferrer" target="_blank">https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>

