title: How to extract requires clause with a parameter pack whose parameters are related to each other into a concept?
body: <p>I've got such a set of toy functions:</p>
  <pre class="lang-cpp prettyprint-override"><code>template &lt;typename... Args&gt;
  requires std::conjunction_v&lt;std::is_convertible&lt;Args, int&gt;...&gt;
  void test(Args...) { std::cout &lt;&lt; &quot;int&quot;; }
  
  template &lt;typename... Args&gt;
  requires std::conjunction_v&lt;
      std::disjunction&lt;std::is_convertible&lt;Args, int&gt;,
                       std::is_convertible&lt;Args, std::string&gt;&gt;...&gt; &amp;&amp;
      std::disjunction_v&lt;std::is_convertible&lt;Args, std::string&gt;...&gt;
  void test(Args...) { std::cout &lt;&lt; &quot;istring&quot;; }
  </code></pre>
  <p>The first function will be called when I uses arguments that are all convertible to int and unconvertible to std::string, like: <code>test(1, 2L, 3.0, 4UL)</code>.</p>
  <p>If there's at least one argument that is convertible to std::string and if all arguments are either convertible to int or std::string, the second function will be called, like <code>test(1, 2L, &quot;Hello&quot;, 4UL)</code>.</p>
  <p>And it does as I expected.</p>
  <p>However, when I code the second function as the below two style, it doesn't work. The concept of arguments are checked one after another, and <code>1, 2L, 4UL</code> are not a <code>Istring</code>.</p>
  <pre class="lang-cpp prettyprint-override"><code>template &lt;typename... Args&gt;
  concept Istring = std::conjunction_v&lt;
      std::disjunction&lt;std::is_convertible&lt;Args, int&gt;,
                       std::is_convertible&lt;Args, std::string&gt;&gt;...&gt; &amp;&amp;
      std::disjunction_v&lt;std::is_convertible&lt;Args, std::string&gt;...&gt;;
  
  void test(Istring auto...) { std::cout &lt;&lt; &quot;istring&quot;; }
  </code></pre>
  <pre class="lang-cpp prettyprint-override"><code>template &lt;typename... Args&gt;
  concept Istring = std::conjunction_v&lt;
      std::disjunction&lt;std::is_convertible&lt;Args, int&gt;,
                       std::is_convertible&lt;Args, std::string&gt;&gt;...&gt; &amp;&amp;
      std::disjunction_v&lt;std::is_convertible&lt;Args, std::string&gt;...&gt;;
  
  template &lt;IString... Args&gt;
  void test(Args...) { std::cout &lt;&lt; &quot;istring&quot;; }
  </code></pre>
  <p>I'm wondering whether there's a way to extract the concept.</p>