title: Where does `Read` come from in this OpenFST function?
body: <p>(Noob alert here---I'm not really a C++ programmer, just finding myself needing to reimplement some C++ code in Java.)</p>
  
  <p>I am attempting to understand <a href="http://www.openfst.org/doxygen/fst/html/util_8h_source.html#l00047" rel="nofollow noreferrer">the following function</a> from OpenFST as part of an effort to enable reading of OpenFST binary files in JOpenFST:</p>
  
  <pre class="lang-cpp prettyprint-override"><code>template &lt;class T,
  typename std::enable_if&lt;std::is_class&lt;T&gt;::value, T&gt;::type* = nullptr&gt;
  inline std::istream &amp;ReadType(std::istream &amp;strm, T *t) {
          return t-&gt;Read(strm);
  }
  </code></pre>
  
  <p>I can't determine what in this template declaration guarantees the existence of <code>Read</code> on <code>t</code>. I realize my understanding of <code>enable_if</code> and <code>is_class</code> are fuzzy, but I don't see what there could provide such a method.</p>
  
  <p>Perhaps it comes from the broader context? Something that declares a <code>Read</code> for all class types??? Here are the imports in <code>util.h</code> where that function resides:</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#include &lt;iostream&gt;
  #include &lt;iterator&gt;
  #include &lt;list&gt;
  #include &lt;map&gt;
  #include &lt;set&gt;
  #include &lt;sstream&gt;
  #include &lt;string&gt;
  #include &lt;type_traits&gt;
  #include &lt;unordered_map&gt;
  #include &lt;unordered_set&gt;
  #include &lt;utility&gt;
  #include &lt;vector&gt;
  
  #include &lt;fst/compat.h&gt;
  #include &lt;fst/types.h&gt;
  #include &lt;fst/log.h&gt;
  #include &lt;fstream&gt;
  
  #include &lt;fst/flags.h&gt;
  #include &lt;unordered_map&gt;
  </code></pre>
  
  <p>Thank you for your patience with a confused Java dev.</p>