Могу ли я определить шаблоны для разных наборов типов?

Мне нужно написать шаблонную функцию, которая ведет себя по-разному в зависимости от класса ее параметра:

template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}

template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}

Я ограничен С++ 11, поэтому static_if исключен. Кроме того, классы ContainerType и NotAContainerType действительно велики и могут измениться в будущем, поэтому простое добавление нескольких исключений вручную в качестве специализации шаблона также нецелесообразно.

Я знаю обходной путь std::enable_if, но как мне его использовать, если мне нужно применить его к двум взаимно различным наборам классов?


person Jonn Dove    schedule 25.07.2018    source источник
comment
Как вы различаете эти типы классов? Без этого кода мы мало чем сможем вам помочь.   -  person Jaa-c    schedule 25.07.2018
comment
std::enable_if это именно то, что вы ищете, так что просто определите, как вы отличаете тип контейнера от других.   -  person scrutari    schedule 25.07.2018
comment
@ Jaa-c, я различаю их так, как следует из их названий: ContainerType для std::containers (например, у них есть iterator ) и NotAConatinerType для всего остального.   -  person Jonn Dove    schedule 25.07.2018


Ответы (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>{});
}
person Jarod42    schedule 25.07.2018
comment
отправка тегов на победу; намного лучше - person Lightness Races in Orbit; 31.05.2019