У меня есть функция, которая имеет шаблон шаблона в качестве параметра:
template<class T> void scheduleTask(T* a);
Но я хочу, чтобы класс, вызвавший эту функцию, расширил класс «Runnnable», в Java вы можете сделать это следующим образом:
public <T extends Runnable> void scheduleTask(T a);
Если я могу, как бы я сделал это в C ++?
У вас есть возможность применить это ограничение с std::is_base_of
, У вас есть два варианта использования.
Влияет на разрешение перегрузки с помощью SFINAE:
template<typename T, typename = typename std::enable_if<std::is_base_of<Runnable, T>::value, T>::type>
void scheduleTask(T *a) {...}
Очиститель, выдает приятное сообщение об ошибке, но не влияет на разрешение перегрузки:
template<typename T>
void scheduleTask(T *a) {
static_assert(std::is_base_of<Runnable, T>::value, "T must be derived from Runnable");
...
}
Оба из них требуют C ++ 11. Я знаю, что у Boost есть пара уловок, если у вас нет доступа к C ++ 11.
Тем не менее, как говорит Джерри в комментариях, может иметь больше смысла вообще не использовать шаблон. Если вы посмотрите на этот вопрос и все еще уверены, что он вам нужен, это должно сработать.
Других решений пока нет …