Откуда происходит `Read` в этой функции OpenFST?
(Предупреждение Noob здесь - я на самом деле не программист на C++, просто обнаружил, что мне нужно переопределить некоторый код C++ в Java.)
Я пытаюсь понять следующую функцию из OpenFST как часть попытки включить чтение двоичных файлов OpenFST в JOpenFST:
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-разработчиком.
1 ответ
Я не могу определить, что в этом объявлении шаблона гарантирует существование
Read
наt
,
Ничто не гарантирует существование.
То есть: если шаблон создается с T
который не имеет Read
функция-член, то компилятор будет жаловаться, что была вызвана несуществующая функция.
С другой стороны, тот факт, что шаблон плохо сформирован, если T::Read
существует (и вызывается с данным аргументом) гарантирует, что T
в любом правильно оформленном экземпляре шаблона будет такой член.