當前我嘗試編寫一個函數retrieveKeys()
,它給了我一個std :: map的鍵並將其存儲在某個std :: container中。該功能在兩種方式中應該是通用的:在C++中推導模板返回類型
- 接受std :: map和std :: unordered_map作爲參數類型。
- 返回用戶定義的容器中的鍵, G。 std :: vector或std :: deque(容器必須支持
push_back()
方法)。
目前使用該功能的工作原理如下:
std::unordered_map<int, int> testMap;
std::map<int, int> testMap2;
std::vector<int> keys1 = retrieveKeys<std::vector>(testMap);
std::deque<int> keys2 = retrieveKeys<std::deque>(testMap);
std::vector<int> keys3 = retrieveKeys<std::vector>(testMap2);
std::deque<int> keys4 = retrieveKeys<std::deque>(testMap2);
用下面的函數:
template<template<typename...> typename KeyContainer, typename... KeyContainer_Rest,
template<typename...> typename MapContainer, typename K, typename V, typename... MapContainer_Rest>
inline KeyContainer<K, KeyContainer_Rest...> retrieveKeys(const MapContainer<K, V, MapContainer_Rest...>& map)
{
KeyContainer<K, KeyContainer_Rest...> keys;
for (const auto& m : map)
{
keys.push_back(m.first);
}
return keys;
}
這將是很好,如果我也不會寫的返回類型明確。但是當我嘗試類似的東西時
std::vector<int> keys1_ = retrieveKeys(testMap);
/*
error: no matching function for call to 'retrieveKeys'
std::vector<int> keys1_ = retrieveKeys(testMap);
^~~~~~~~~~~~
*/
我在使用叮噹聲3.6(C++ 17)編譯時遇到上述錯誤。
所以我的問題是:是否有可能重寫函數,以便編譯器可以減少返回類型?
這裏又容易複製的完整代碼:
#include <deque>
#include <vector>
#include <unordered_map>
#include <map>
template<template<typename...> typename KeyContainer, typename... KeyContainer_Rest,
template<typename...> typename MapContainer, typename K, typename V, typename... MapContainer_Rest>
inline KeyContainer<K, KeyContainer_Rest...> retrieveKeys(const MapContainer<K, V, MapContainer_Rest...>& map)
{
KeyContainer<K, KeyContainer_Rest...> keys;
for (const auto& m : map)
{
keys.push_back(m.first);
}
return keys;
}
int main()
{
std::unordered_map<int, int> testMap;
std::map<int, int> testMap2;
std::vector<int> keys1 = retrieveKeys<std::vector>(testMap);
std::deque<int> keys2 = retrieveKeys<std::deque>(testMap);
std::vector<int> keys3 = retrieveKeys<std::vector>(testMap2);
std::deque<int> keys4 = retrieveKeys<std::deque>(testMap2);
//std::vector<int> keys1_ = retrieveKeys(testMap);
/*
error: no matching function for call to 'retrieveKeys'
std::vector<int> keys1_ = retrieveKeys(testMap);
^~~~~~~~~~~~
*/
}
的'返回類型使用'auto'但是這並不'auto'在調用點工作,而是依靠隱式轉換 – TemplateRex
@TemplateRex那麼,信息必須來自某處* ...必須知道目標類型,或者必須使用顯式模板參數。 –
@ T.C。當然,但這仍然是巧妙的,我認爲鼓勵隱式轉換是一種糟糕的風格。 – TemplateRex