(这里的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_if
和is_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开发人员的耐心等候。
答案 0 :(得分:1)
我无法确定此模板声明中的哪些内容可以保证
Read
上存在t
。
没有任何东西可以保证存在。
也就是说:如果模板是用没有成员函数T
的{{1}}实例化的,那么编译器将抱怨调用了一个不存在的函数。
从另一个角度来看,除非Read
存在(并且可以用给定的参数调用),否则模板是不正确的,这保证了T::Read
在模板的任何格式正确的实例中都将具有这样的成员