Можно ли специализировать эту функцию шаблона, чтобы она принимала только объекты, соответствующие GenericPart?
Нельзя частично специализировать функцию шаблона.
Но вы можете SFINAE включать / отключать другую его версию в соответствии с характеристиками f T
.
. Например, вы можете включить function()
только для T
, поддерживающих Value1()
и Value2()
методы, как следует
template <typename T>
auto function (T record)
-> decltype( record.Value1(), record.Value2(), void() )
{ std::cout << record.Value1() << " " << record.Value2() << std::endl; }
Сложнее отключить function()
, если не поддерживает некоторые методы (но см. ответ Тимо: учитывая, что has_feature_set
становится тривиальным), поэтому я предлагаю добавить неиспользуемый параметр некоторого типа (например, int
)
template <typename T> // VVV <-- unused argument
auto function (T record, int)
-> decltype( record.Value1(), record.Value2(), void() )
{ std::cout << record.Value1() << " " << record.Value2() << std::endl; }
и разработать обобщенную функцию c, которая принимает неиспользуемый тип другого (но совместимого) типа (например, long
) и всегда включена
template <typename T> // VVVV <-- unused argument
void function (T record, long)
{ /* do something with record */ }
Теперь вы можете написать первый уровень function()
следующим образом
template <typename T>
void function (T record)
{ function(record, 0); }
Обратите внимание, что вы передаете 0
(a int
) на второй уровень function()
.
Таким способом выполняется точное совпадение, function(T, int)
, если доступно (то есть, если T
поддерживает запрошенные методы). В противном случае выполните версию generi c, function(T, long)
, которая всегда доступна.