OpenFST函数中的“读取”来自哪里?

时间:2019-01-19 21:57:49

标签: c++ openfst

(这里的Noob警报-我不是真正的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);
}

我无法确定此模板声明中的哪些内容可以保证Read上存在t。我意识到对enable_ifis_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开发人员的耐心等候。

1 个答案:

答案 0 :(得分:1)

  

我无法确定此模板声明中的哪些内容可以保证Read上存在t

没有任何东西可以保证存在。

也就是说:如果模板是用没有成员函数T的{​​{1}}实例化的,那么编译器将抱怨调用了一个不存在的函数。

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