У меня есть две функции, которые я перегруженные для моего класса отладки:перегруженная функция не используется:
template<class IteratorT>
inline debug&
operator()(const std::string& name,
IteratorT begin,
IteratorT end)
{
_stream << indent(internal) << "g< " << name << " : [ ";
for (auto i = begin; i != end; i++)
_stream << (*i) << " ";
_stream << "] >" << std::endl;
return *this;
}
И
inline debug&
operator()(const std::string& name,
std::vector<uint8_t>::const_iterator begin,
std::vector<uint8_t>::const_iterator end)
{
_stream << indent(internal) << "u8< " << name << " : [ " << std::hex;
std::copy(begin, end, std::ostream_iterator<uint32_t>(_stream, " "));
_stream << "] >" << std::endl;
return *this;
}
Вот является пропущено, как он используется:
int main()
{
debug log;
std::vector<uint8_t> vec;
vec.push_back(0xde);
vec.push_back(0xad);
vec.push_back(0xc0);
vec.push_back(0xde);
log("vec", vec.begin(), vec.end());
}
Выход (поскольку он не печатается в виде шестнадцатеричных символов, я пропустил неформатированный результат):
g< "vec" : [ ... ] >
Вместо
u8< "vec" : [ de ad c0 de ] >
По какой-то причине компилятор не собирание правильный, перегруженной функции.
$ g++47 --version
g++47 (GCC) 4.7.0 20120224 (experimental)
Хорошо. С другой стороны, перегрузка лучше, чем частичная специализация? – nerozehl
частичная специализация будет использоваться, если вы хотите особого поведения для всех векторных итераторов по сравнению с общими. Не уверен, возможно ли частично специализироваться на итераторах, значение value_type - uint8_t – CashCow
@nerozehl: Вы не можете частично специализировать функцию, поэтому вопрос имеет ясный простой ответ ... возможный или невозможный.Теперь вы можете перенести функцию как статическую не-шаблонную функцию-член класса шаблона, и в этом случае вы можете частично специализироваться, получая гибкость за счет дополнительного кода. Но я не уверен, что вы многое извлечете из этого. С другой стороны, если вы имеете в виду * полную * специализацию функции, следует предпочесть перегрузки, но я не могу вспомнить точные детали того, почему и где это важно ... google для него :) –