这个 OpenFST 函数中的 Read 来自哪里?

Where does `Read` come from in this OpenFST function?

(新手警告---我不是真正的 C++ 程序员,只是发现自己需要在 Java 中重新实现一些 C++ 代码。)

我试图从 OpenFST 中理解 the following function 作为在 JOpenFST 中启用读取 OpenFST 二进制文件的努力的一部分:

template <class T,
typename std::enable_if<std::is_class<T>::value, T>::type* = nullptr>
inline std::istream &ReadType(std::istream &strm, T *t) {
        return t->Read(strm);
}

我无法确定此模板声明中的内容保证了 Readt 上的存在。我发现我对enable_ifis_class的理解很模糊,但是我看不出有什么可以提供这样的方法。

也许它来自更广泛的背景?为所有 class 类型声明 Read 的东西???以下是该函数所在的 util.h 中的导入:

#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#include <fst/compat.h>
#include <fst/types.h>
#include <fst/log.h>
#include <fstream>

#include <fst/flags.h>
#include <unordered_map>

感谢您对困惑的 Java 开发者的耐心等待。

I can't determine what in this template declaration guarantees the existence of Read on t.

没有什么能保证存在。

即:如果模板被实例化为T而没有Read成员函数,那么编译器会报错调用了一个不存在的函数。

从另一个角度来看,除非 T::Read 存在(并且可以使用给定的参数调用),否则模板是错误格式的这一事实保证了 T 在模板的任何格式良好的实例化中都将具有这样的成员。