title: check if type has certain value types and the keyword value_type itself using c++20
body: <p>I have following code</p>
  <pre><code>#include &lt;type_traits&gt;
  
  template&lt;typename T, typename U, typename Tout&gt;
  requires std::is_integral&lt; typename T::value_type &gt;
  &amp;&amp; std::is_floating_point&lt; typename U::value_type &gt;
  &amp;&amp; std::is_floating_point&lt; typename Tout::value_type &gt;
  class test
  {
      test() =default;
  };
  
  
  int main(int argc, char const *argv[])
  {
      /* code */
      return 0;
  }
  </code></pre>
  <p>I essentially want to ensure that the template argument have certain types, integral or floating point.
  There are two issues:</p>
  <ol>
  <li>The code does not compile. Complains that it needs '(' for function style cast or type construction. Not sure why?</li>
  <li>I am assuming that T,U,Tout all have the keyword <code>value_type</code>. I also want the class to work out if somebody is passing a raw pointer to an integral type or floating point. Is there an easy way to incorporate that?</li>
  <li>If not, how can we ensure that the error message is very clear when somebody tries to pass a template argument which does not have the <code>value_type</code></li>
  </ol>