我有,我已經超負荷了我的調試類兩種功能:重載函數沒有被使用:
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 2012-02-27 17:32:34
如果您希望所有向量迭代器在一般情況下具有特殊行爲,將使用部分專用化。不知道是否有可能部分專注於value_type爲uint8_t – CashCow 2012-02-27 17:43:43
@nerozehl的迭代器:你不能部分地專門化一個函數,所以這個問題有一個明確的簡單答案......可能與不可能。現在,您可以將該函數移動爲模板類的靜態非模板成員函數,在這種情況下,您可以部分專門化,以額外代碼爲代價獲得靈活性。但我不確定你會從中得到什麼。另一方面,如果你的意思是一個*完整的*專業化的功能,過載應該是首選,但我不記得爲什麼/它在哪裏重要的具體細節...谷歌它:) – 2012-02-27 17:44:57