[英]Templated method with overloaded name
為了與庫中的其他類保持一致,下面的數組類具有兩個read()方法。 第一個將整個數組讀取到一個輸出迭代器,並返回一個錯誤代碼,第二個讀取一個值並將其返回(使用錯誤的異常)。
我遇到的問題是,如果我使用int調用第二個read(size_t idx)方法,則編譯器將首選模板化方法。 我需要明確指定一個unsigned int才能使其正常工作。 我的問題是,針對此問題,我有哪些選擇:
-------------------------------------------------- -----------
#include <iostream>
#include <iterator>
#include <vector>
struct FooArray
{
template <typename TIter>
int read( TIter out )
{
*out++ = 123.456; // copy stuff to output iterator
return 99; // error code
}
double read( size_t index )
{
return 1.234; // return value at index
}
};
int main(int argc, char**argv)
{
FooArray tmp;
std::cout << tmp.read(10u) << std::endl;
/* std::cout << tmp.read(10) << std::endl; COMPILER ERROR */
tmp.read( std::ostream_iterator<double>(std::cout,"\n") );
}
此外,我認為size_t
不能保證是unsigned
的同義詞,因此即使后綴為“ u”,該代碼也可能不可移植。
std::string
有一個類似的問題,必須區分:
string s(10, 97); //size_t, char
string t(s.begin(), s.end()); //iter
這將在內部將調用轉發給合適的幫助函數(如果參數是必不可少的,則需要在某處進行編譯時測試)。
但是,根據您的情況,返回類型也不同,因此,您必須選擇正確的重載開始。
使用enable_if
看起來不會那么糟糕:
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>
struct FooArray
{
template <typename TIter>
typename boost::disable_if<boost::is_integral<TIter>, int>::type
read( TIter out )
{
*out++ = 123.456; // copy stuff to output iterator
return 99; // error code
}
double read( size_t index )
{
return 1.234; // return value at index
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.