<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 19 December 2016 at 14:48, John Spicer <span dir="ltr">&lt;<a href="mailto:jhs@edg.com" target="_blank">jhs@edg.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><span class=""><br><div><blockquote type="cite"><div>On Dec 19, 2016, at 5:27 PM, Richard Smith &lt;<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>&gt; wrote:</div><br class="m_-5306618435199841320Apple-interchange-newline"><div><div dir="ltr"><div><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0195r2.html" target="_blank">http://www.open-std.org/jtc1/<wbr>sc22/wg21/docs/papers/2016/<wbr>p0195r2.html</a> suggests a feature test macro of __cpp_variadic_using; the value would presumably be 201611. Does that seem OK to everyone?<br></div></div><br></div></blockquote><br></div></span><div>I think it is okay.</div><div><br></div><div>I think it is slightly odd as the change is to allow multiple names in a using-declaration, but the expected use case is for variadics.</div><div><br></div><div>I’d also be okay with something like __cpp_multi_using.</div><div><br></div><div>__cpp_variadic_using had more support when it was discussed in core, FWIW.</div></div></blockquote><div><br></div><div>I don&#39;t see any reason you&#39;d want to feature test for the multiple-names-in-one-using-declaration part of the feature -- just don&#39;t use them if you want to be compatible with old language modes. But the variadic part does seem like something people would want to feature-test for. I can imagine someone wanting to write:</div><div><br></div><div>#if __cpp_variadic_using &gt;= 201611</div><div>template&lt;typename ...T&gt; struct Callable : T... {</div><div>  using T::operator() ...;</div><div>};</div><div>#else</div><div>template&lt;typename ...T&gt; struct Callable;</div><div>template&lt;typename T, typename ...U&gt; struct Callable&lt;T, U...&gt; : T, Callable&lt;U...&gt; {</div><div>  using T::operator();</div><div>  using Callable&lt;U...&gt;::operator();</div><div>};</div><div>template&lt;typename T&gt; struct Callable&lt;T&gt; : T {</div><div>  using T::operator();</div><div>};</div><div>template&lt;&gt; struct Callable&lt;&gt; {};</div><div>#endif<br></div></div></div></div>