Vit*_*meo 4 c++ templates types typename c++11
我正在尝试创建一个从a std::map或an 获取键的函数std::unordered_map。我可以使用简单的重载,但首先我想知道这段代码有什么问题。
template<typename K, typename V, template<typename, typename> class TContainer>
std::vector<K> getKeys(const TContainer<K, V>& mMap)
{
std::vector<K> result;
for(const auto& itr(std::begin(mMap)); itr != std::end(mMap); ++itr) result.push_back(itr->first);
return result;
}
Run Code Online (Sandbox Code Playgroud)
当使用调用它时std::unordered_map,即使手动指定所有模板类型名称,clang ++ 3.4 也会说:
template template参数的模板参数与其对应的模板template参数不同。
问题是,std::map并std::unordered_map没有实际上的模板有两个参数。他们是:
namespace std {
template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T>>>
class map;
template <class Key, class T, class Hash = hash<Key>,
class Pred = equal_to<Key>,
class Allocator = allocator<pair<const Key, T>>>
class unordered_map;
}
Run Code Online (Sandbox Code Playgroud)
这确实有效:
template <typename K, typename... TArgs, template<typename...> class TContainer>
std::vector<K> getKeys(const TContainer<K, TArgs...>& mMap)
{
std::vector<K> result;
for (auto&& p : mMap)
result.push_back(p.first);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我想要的版本:
template <typename Container>
auto getKeys2(const Container& mMap) -> std::vector<typename Container::key_type>
{
std::vector<typename Container::key_type> result;
for (auto&& p : mMap)
result.push_back(p.first);
return result;
}
Run Code Online (Sandbox Code Playgroud)
同时使用这两个功能的演示程序:http : //ideone.com/PCkcu6