Вы должны взглянуть на заголовок boost boost / utility / enable_if.hpp и соответствующий мета / шаблон программного кода.
Самый простой способ здесь - иметь две версии fooфункция, обе функции шаблона.Одна из функций будет использовать конструкцию enable_if, а другая - конструкцию disable_if.
Я уверен, что вы можете найти лучшие примеры на сайте boost, но что-то вроде этого:
template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }
Эта функция будет определена только в том случае, если Template является допустимым типом.Поскольку вы всегда хотите скомпилировать, вам понадобится аналог, вызываемая функция, когда она недопустима:
template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }
Я не уверен, что вы можете в рамках одного шаблона определить две функции-члена вэтот шаблон, не делая их обе функции шаблона.Полагаю, вы сможете определить две функции шаблона и установить для параметра шаблона по умолчанию значение T.
Надеюсь, это немного поможет.