Лично я бы остался с общедоступным шаблоном, конечно, вы будете вынуждены затем доставлять включенные заголовки вместе с вашими собственными, но в этом случае я бы просто обозначил байты, чтобы предоставить пользователям максимальную гибкость. вашего класса.
Вы можете скрыть это, по крайней мере, в отдельном файле ".inl" или ".impl" (не решает в том смысле, в котором вы его просили, но делает его менее заметным):
class TFRuntime
{
template <typename T>
Status computeXYSlice(Volume<T>* input, int zCoord, Volume<T>* output);
};
#include "TFRuntime.inl"
и
#include <tensorflow/cc/ops/standard_ops.h>
#include <tensorflow/cc/saved_model/loader.h>
template <typename T>
Status TFRuntime::computeXYSlice(Volume<T>* input, int zCoord, Volume<T>* output)
{
// ...
}
Если вы действительно хотите ограничить диапазон используемых типов данных, я бы сделал это через перегрузки:
class TFRuntime
{
public:
Status computeXYSlice(Volume<int>* input, int zCoord, Volume<int>* output);
Status computeXYSlice(Volume<double>* input, int zCoord, Volume<double>* output);
Status computeXYSlice(Volume<unsigned long>* input, int zCoord, Volume<unsigned long>* output);
private:
template <typename T>
Status computeXYSlice(Volume<T>* input, int zCoord, Volume<T>* output);
};
Поскольку теперь функция шаблона является закрытой, ее нельзя вызывать извне, и вы можете безопасно внедрить ее в файл .cpp (где будут создаваться только необходимые специализации) вместе с обычными перегруженными функциями, вызывающими функция шаблона (вам нужно явно указать параметр шаблона для предотвращения рекурсии - или дать функции шаблона другое имя). не реализуйте перегрузки уже в определении класса, в противном случае они становятся встроенными, и вы снова предоставляете функцию шаблона другим классам, требуя, чтобы реализация была снова доступна ...