2010-09-29 101 views
0

爲了與庫中的其他類保持一致,我的數組類下面有兩個read()方法。第一個將整個數組讀取到輸出迭代器並返回錯誤代碼,第二個讀取單個值並返回(使用異常錯誤)。重載名稱的模板化方法

我遇到的問題是,如果我用int調用第二個read(size_t idx)方法,編譯器更喜歡模板化方法。我需要明確指定一個unsigned int來使其工作。我的問題是,是什麼我解決此問題的選項:

  • 重命名或者讀取功能,以避免過載
  • 使用類似的boost :: enable_if防止迭代器版本,從非迭代工作。這雖然... sullies界面...
  • 我失蹤的任何其他想法?

-------------------------------------------- -----------------

#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")); 
} 

回答

1

此外,我不認爲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 
    } 
}; 
+0

+1,正是我想要的實際閱讀你的答案的xD – 2010-09-30 05:24:17

+0

感謝證實了我認爲之前寫的。我會給enable_if方法一個去看看我的模板恐懼同事抱怨! – 2010-09-30 07:38:52