Откуда происходит `Read` в этой функции OpenFST? - PullRequest
0 голосов
/ 20 января 2019

(Предупреждение 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 Ответ

0 голосов
/ 20 января 2019

Я не могу определить, что в этом объявлении шаблона гарантирует существование Read на t.

Ничто не гарантирует существование.

То есть: если шаблон создается с T, который не имеет Read функции-члена, то компилятор будет жаловаться, что была вызвана несуществующая функция.

С другой стороны, тот факт, что шаблон является некорректно сформированным, если T::Read не существует (и его нельзя вызвать с данным аргументом), гарантирует, что T в любом правильно сформированном экземпляре шаблона будет иметь такой член.

...