0

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

我试图从 OpenFST 中理解以下功能,以努力在 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);
}

我无法确定此模板声明中的哪些内容保证了Readon的存在t。我意识到我的理解enable_ifis_class模糊,但我看不出有什么可以提供这样的方法。

也许它来自更广泛的背景?Read为所有类类型声明 a 的东西???以下是该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 开发人员的耐心等待。

4

1 回答 1

1

我无法确定此模板声明中的哪些内容保证了Readon的存在t

没有什么能保证存在。

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

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

于 2019-01-19T22:07:33.793 回答