Могу ли я определить шаблоны для разных наборов типов?
Мне нужно написать шаблонную функцию, которая ведет себя по-разному в зависимости от класса ее параметра:
template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}
template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}
Я ограничен C++11, поэтому static_if
со стола Кроме того, классы ContainerType
а также NotAContainerType
они действительно большие и могут измениться в будущем, поэтому просто добавление нескольких исключений вручную в качестве специализации шаблона также не имеет смысла.
Я знаю о std::enable_if
Обходной путь, но как мне его использовать, если мне нужно применить его к двум взаимно отличающимся наборам классов?
1 ответ
Решение
Создайте черты для вашей концепции Контейнер, тогда вы можете использовать SFINAE
template <typename T>
typename std::enable_if<is_container<T>::value, bool>::type
myFunc(T in){
//do some stuff
}
template <typename T>
typename std::enable_if<!is_container<T>::value, bool>::type
myFunc(T in){
//do some stuff
}
или отправка тегов
namespace details
{
template <typename T>
bool myFunc(T in, std::true_type){
//do some stuff
}
template <typename T>
bool myFunc(T in, std::false_type){
//do some stuff
}
}
template <typename T>
bool myFunc(T in){
return details::myFunc(in, is_container<T>{});
}