title: Partial class template specialization based on a condition?
body: <p>I generally don't see, how it could be implemented.</p>
  <p>I have an incomplete class template used to &quot;override&quot; some methods.<br />
  This one is a working example:</p>
  <pre><code>template&lt;typename...&gt;
  struct make_completion;
  
  struct ServiceTraits
  {
      using mode_type = ModeType;
      using warning_type = Waring;
      using error_type = Error;
      using iteration_result_type = IterationResult;
  
      using steering_type = Steering;
  
      using sync_tag_t = decltype(asio::use_future);
  };
  
  template&lt;typename SignatureT&gt;
  struct make_completion&lt;ServiceTraits, SignatureT&gt;
  {
      template&lt;typename CompletionToken&gt;
      auto operator()(ServiceTraits, CompletionToken &amp;&amp;completionToken)
      {
          using result_type = asio::async_result&lt;std::decay_t&lt;CompletionToken&gt;, SignatureT&gt;;
          using completion_handler = typename result_type::completion_handler_type;
  
          completion_handler handler{ std::forward&lt;CompletionToken&gt;(completionToken) };
          result_type result{ handler };
  
          return Completion&lt;result_type, completion_handler&gt;{ std::move(result), std::move(handler) };
      }
  };
  
  </code></pre>
  <p>I want to assemble <code>traits</code> class via inheritance, so, for instance, I would have several traits classes and then arbitrarily combine them.</p>
  <p>For example:</p>
  <pre><code>template&lt;typename ResultT, typename HandlerT&gt;
  struct completion
  {
     using result_type = ResultT;
     using handler_type = HandlerT;
     result_type result;
     handler_type handler;
  };
  
  // this would be inherited from
  struct asio_traits
  {
     using sync_tag_t = decltype(asio::use_future);
  };
  </code></pre>
  <p>The problem is, I can not use something like <code>std::enable_if</code> in a specialization.<br />
  This will not compile:</p>
  <pre><code>template&lt;typename DerivedTraits,
           typename SignatureT,
           typename = std::enable_if_t&lt;std::is_base_of_v&lt;asio_traits, DerivedTraits&gt;&gt;&gt;
  struct eos::method::make_completion&lt;DerivedTraits, SignatureT&gt;
  {
     // impl here...
  };
  </code></pre>
  <p>Is it possible to somehow use a condition for class template specialization?</p>