Возможно ли сделать компилятор между шаблонами в зависимости от типа? Например, рассмотрим две реализации шаблона функциональности Compare, один для последовательных типов (string
s, vector
s, list
и т. Д.), А другой для целых типов. Можем ли мы иметь только одну специализацию по шаблону для каждого класса типов?Специализация шаблона ограничена условием
template <class SeqT>
class Compare
{
public:
bool operator()(const SeqT& s1, const SeqT& s2) const
{
typename SeqT::const_iterator it1=s1.begin();
typename SeqT::const_iterator it2=s2.begin();
while(it1!=s1.end() && it2!=s2.end())
{
if(*it1<*it2) return true;
if(*it2<*it1) return false;
++it1; ++it2;
}
return it2!=s2.end();
}
};
template <class IntegerT>
class Compare
{
public:
bool operator()(IntegerT i1, IntegerT i2) const
{
return i1<i2;
}
};
template <class T, class Cmp = Compare<T> >
class SomeContainer
{
...
};
В принципе, то, что я ищу способ частично специализировать шаблон путем наложения условия на аргумент шаблона. Подобно первая Compare<>
специализация должна быть применена к следующим типам: std::basic_string<>
, std::vector<>
, std::list<>
, и второй для следующих типов: int
, unsigned
, short
, char
. Это возможно?
Да. Посмотрите на std :: enable_if – bolov
Сначала я думал о 'std :: enable_if', но я думаю, что лучше добавить параметр шаблона, который указывает тип типа, и который может быть« вычислен »TMP из базового типа. Затем просто укажите специализации. –
Что вы подразумеваете под последовательностью - вы имеете в виду любой объект, который можно повторить с помощью синтаксиса 'for (auto x: y)'? – Yakk