gpt4 book ai didi

c++ - C++ 中的模板化映射/多映射函数

转载 作者:太空狗 更新时间:2023-10-29 19:41:08 26 4
gpt4 key购买 nike

假设我有:

std::map<K, V1> m1;
std::multimap<K, V2> m2;

我想按容器类型和键/值类型制作模板。但是,以下内容不起作用:/

template <typename T>
void do_something(T var)
{
// do something
}

template <typename TContainer, typename TKey, typename TVal>
void func(const TContainer<TKey, TVal>& container)
{
for (typename TContainer<TKey, TVal>::iterator it = container.begin(); it != container.end(); ++it)
{
do_something(it->second);
}
}

然后调用它:

func(m1);
func(m2);

最佳答案

这不起作用的原因是 std::map 采用四个 模板参数:

template<class Key,
class Value,
class Predicate = std::less<Key>,
class Allocator = std::allocator<pair<const Key, Value> > >
class map;

虽然您可以省略最后两个参数来实例化,但您必须列出它们才能使模板匹配起作用:

template < typename TKey, 
typename TVal,
class TPr,
class TAl
template<typename,typename,class,class> TContainer >
void func(const TContainer<TKey, TVal, TPr, TAl>& container)
{
for (typename TContainer<TKey, TVal, TPr, TAl>::iterator it = container.begin(); it != container.end(); ++it)
{
do_something(it->second);
}
}

不过,我想知道您为什么要为此烦恼。惯用的方法是传递迭代器:

template <typename FwdIt>
void func(FwdIt begin, FwdIt end)
{
while(begin != end) {
do_something(begin->second);
++begin;
}
}

这还允许您传入任何兼容的内容:

void f(const std::vector< std::pair<int, std::string> >& v)
{
func( v.begin(), v.end() );
}

关于c++ - C++ 中的模板化映射/多映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3203811/

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