gpt4 book ai didi

c++ - 在 C++ 中推导模板返回类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:57 24 4
gpt4 key购买 nike

目前,我尝试编写一个函数 retrieveKeys(),它给我 std::map 的键并将其存储在一些 std::container 中。该函数应在两种方面具有通用性:

  • 接受 std::mapstd::unordered_map 作为参数类型。
  • 返回用户定义容器中的 key ,例如。 G。 std::vectorstd::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);
^~~~~~~~~~~~
*/

我在使用 clang 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);
^~~~~~~~~~~~
*/
}

最佳答案

template <typename K, typename M>
struct ReturnTypeDeducer
{
const M& map;

ReturnTypeDeducer(const M& m) : map(m) {}

template <template <typename...> typename KeyContainer, typename... KeyContainer_Rest>
operator KeyContainer<K, KeyContainer_Rest...>() &&
{
KeyContainer<K, KeyContainer_Rest...> keys;
for (const auto& m : map)
{
keys.push_back(m.first);
}
return keys;
}
};

template <template <typename...> typename MapContainer, typename K, typename V, typename... MapContainer_Rest>
inline ReturnTypeDeducer<K, MapContainer<K, V, MapContainer_Rest...>> retrieveKeys(const MapContainer<K, V, MapContainer_Rest...>& map)
{
return map;
}

int main()
{
std::unordered_map<int, int> testMap;
std::map<int, int> testMap2;

std::vector<int> keys1 = retrieveKeys(testMap);
std::deque<int> keys2 = retrieveKeys(testMap);
std::vector<int> keys3 = retrieveKeys(testMap2);
std::deque<int> keys4 = retrieveKeys(testMap2);
}

DEMO

关于c++ - 在 C++ 中推导模板返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32637879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com