簡體   English   中英

如何編寫基於處理返回不同類型的std :: list的C ++函數?

[英]How can I write a C++ function that returns different types of std::list based on processing?

下面的代碼在指示的點有什么問題? 我想根據文件中某處讀取的程序返回整數,字符或字符串的列表。 我嘗試下面的代碼,但它引發我錯誤。 如您所見,我對模板有點虛弱。

template <class T> 
std::list<T> function1(int type)
{
   using namespace std;
   if (1 == type)
      return list<int>(3, 100); / No error
   else if (2 == type){
      list<wchar_t> temp;
      temp.push_back(L'a');  // C2664 error here
      return temp;
   }else if (3 == type){
      list<wstring> temp;
      temp.push_back(L"a"); // C2664 error here
      return temp;
   }else
      return nullptr;   // C2664 error here
}

我已經指出了“ Visual Studio 2013社區版更新4”引發編譯器錯誤C2664的要點。 我如何這樣寫,以便根據內部處理獲得列表? 錯誤之一在下面。

Error   1   error C2664: 'std::list<int,std::allocator<_Ty>>::list(std::initializer_list<_Ty>,const std::allocator<_Ty> &)' : cannot convert argument 1 from 'std::list<wchar_t,std::allocator<wchar_t>>' to 'const std::list<int,std::allocator<_Ty>> &'

這是不可能的,需要在編譯時解析模板,但是在那里不知道type的值。 您將需要使用一些間接方式,例如boost::variant或非模板接口。 或更確切地說,使用完全不同的方法。

換句話說:模板本身沒有足夠的信息來進行編譯。 使用模板時,需要通過提供模板參數來實例化它。 編譯器無法決定以后再找出其參數(否則可能會涉及一些即時編譯)。 我認為您不能使用專業化來解決此問題,因為返回類型將不兼容。 (很抱歉,我寫了一個新答案...我還沒有發表評論的權限...)

很難確定list對象的類型,然后返回它或指向它的指針,以便可以在調用function1的函數中使用它。 您可以考慮重構代碼。 如果可能的話,您可以嘗試從其他函數中調用其他函數進行進一步處理。

如果您堅持要從function1返回列表: 我可以想到的一個想法是創建一個包裝器類,其中包含指向列表的void*指針(動態分配),以及一個告訴您類型的東西(例如, int type )。 但是其他功能可能必須遵循這種模式。 JK。 (這肯定會解決更多麻煩。)

對於在任何特定類型上的函數模板的任何實例化,至少一個文字可能與該類型不兼容。

您可以使用某些traits類的專門化,該類提供各種受支持類型的值。 這使得支持新類型變得容易。 或者,您可以僅對各種受支持的類型使用函數的重載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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