簡體   English   中英

如何編寫一個采用通用C ++標准庫容器的模板函數

[英]How can I write a template function that takes a generic C++ standard library container

例如,我有一個功能需要能夠適用於不同的容器類型

void foo(const std::vector<bar>& param1, const std::vector<double>& params2)

void foo(const std::list<bar>& param1, const std::list<double>& params2)

bar是我寫的一個class 函數體本身使用通用的C ++標准庫函數。

有沒有辦法可以扼殺這個? 我努力了

template<typename T> void foo(const T<bar>&, const T<double>&)

但這會給編譯器帶來錯誤

錯誤C2988:無法識別的模板聲明/定義

我正在使用MSVC2015。

您應該將T聲明為模板模板參數,以指示它是模板名稱(並且需要實例化參數),例如

template<template <typename...> class T> 
void foo(const T<bar>&, const T<double>&);

生活

基本上有三種解決方案:

  1. 使用模板模板參數

  2. 使用迭代器(這是標准庫本身使用的)

  3. 對不同的參數使用不同的模板,讓編譯器推導出實際的類型。 有了你的功能,它就像是

     template<typename T, typename U> void foo(const T&, const U&); 

如果您只需要迭代容器的內容,建議使用解決方案2。 如果您需要訪問容器本身,建議使用解決方案3。

所謂的模板模板參數將允許您編寫所需的代碼(如其他答案或CppReference中所示 )。

或者,您也可以編寫接受迭代器的泛型函數。 這正是<algorithm>中的函數的實現方式。 我傾向於認為接受迭代器的函數實際上更靈活,因為調用者可以決定函數需要處理的范圍。

暫無
暫無

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

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