2010-09-29 99 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