簡體   English   中英

具有重載名稱的模板化方法

[英]Templated method with overloaded name

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

我遇到的問題是,如果我使用int調用第二個read(size_t idx)方法,則編譯器將首選模板化方法。 我需要明確指定一個unsigned int才能使其正常工作。 我的問題是,針對此問題,我有哪些選擇:

  • 重命名任一讀取函數以避免過載
  • 使用boost :: enable_if之類的東西來防止迭代器版本與非迭代器一起使用。 但這會弄臟界面...
  • 我還有其他想法嗎?

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

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM