更多 C++ 模板?
More templates in C++?
我的任务是制作一个 multimap_util 模板 class 来帮助使用 multimap。
我的主要问题是 multimap_util class 也应该与自定义排序的多图一起使用。
我不知道如何让它与两个不同的模板一起工作。
所以有 2 个这样的模板参数:
std::multimap<int, int> m;
multimap_util<int, int> mu( m );
并且有 3 个这样的模板参数:
std::multimap<std::string, std::string, string_size_more> lmm;
multimap_util<std::string, std::string, string_size_more> lmmu( lmm );
这是我的代码:
template <typename T1, typename T2, typename C>
class multimap_util
{
std::multimap<T1, T2, C>* map;
public:
multimap_util(std::multimap<T1,T2>& map) : map(&map)
{};
multimap_util(std::multimap<T1,T2,C>& map) : map(&map)
{};
.
.
.
}
我总是遇到这样的错误:
error: wrong number of template arguments (2, should be 3)
66 | multimap_util<std::string, std::string> langsu( langs );
必须在没有可变参数模板的情况下完成。
我对模板偏特化很感兴趣,但我不知道它是如何工作的。
我还考虑过使用派生自 util class?
的不同模板制作子 class
考虑到 std::multimap
有 ever 4 个模板参数。但是第三个和第四个模板参数有一个默认值。
在我看来,你能做的最好的事情就是模仿 std::multimap
签名 that is
template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class multimap;
你可以这样写class
template <typename K, typename V,
typename C = std::less<K>,
typename A = std::allocator<std::pair<K const, V>>>
class multimap_util
{
private:
std::multimap<K, V, C, A>* map;
public:
multimap_util (std::multimap<K, V, C, A> & m) : map{&m}
{};
};
这适用于
std::multimap<int, int> m;
multimap_util<int, int> mu( m );
因为它等同于
std::multimap<int, int, std::less<int>, std::allocator<std::pair<int const, int>> m;
multimap_util<int, int, std::less<int>, std::allocator<std::pair<int const, int>> mu( m );
并且在您声明带有 3 或 4 个模板参数的 multimap_util
时也有效:永远是 4,但其中一些可以默认。
不幸的是你不能使用 C++17 或 C++20 因为从 C++17 开始可用 CTAD(Class 模板参数推导)所以你也可以写
std::multimap<int, int> m;
multimap_util mu( m ); // <-- CTAD at works
和所有模板参数,对于multimap_utils
,都是从m
参数推导出来的。
为了简化您的生活,您也可以在 C++11 中编写一个 make_multimap_util()
函数,如下所示
template <typename K, typename V, typename C, typename A>
multimap_util<K, V, C, A> make_multimap_util (std::multimap<K, V, C, A> & m)
{ return {m}; }
因此,利用 auto
占位符的强大功能,您可以简单地编写
std::multimap<int, int> m;
auto mu = make_multimap_util(m);
和 mu
变成了 multimap_util<int, int>
或者,它是一回事, multimap_util<int, int, std::less<int>, std::allocator<std::pair<int const, int>>
.
我的任务是制作一个 multimap_util 模板 class 来帮助使用 multimap。 我的主要问题是 multimap_util class 也应该与自定义排序的多图一起使用。
我不知道如何让它与两个不同的模板一起工作。
所以有 2 个这样的模板参数:
std::multimap<int, int> m;
multimap_util<int, int> mu( m );
并且有 3 个这样的模板参数:
std::multimap<std::string, std::string, string_size_more> lmm;
multimap_util<std::string, std::string, string_size_more> lmmu( lmm );
这是我的代码:
template <typename T1, typename T2, typename C>
class multimap_util
{
std::multimap<T1, T2, C>* map;
public:
multimap_util(std::multimap<T1,T2>& map) : map(&map)
{};
multimap_util(std::multimap<T1,T2,C>& map) : map(&map)
{};
.
.
.
}
我总是遇到这样的错误:
error: wrong number of template arguments (2, should be 3)
66 | multimap_util<std::string, std::string> langsu( langs );
必须在没有可变参数模板的情况下完成。
我对模板偏特化很感兴趣,但我不知道它是如何工作的。 我还考虑过使用派生自 util class?
的不同模板制作子 class考虑到 std::multimap
有 ever 4 个模板参数。但是第三个和第四个模板参数有一个默认值。
在我看来,你能做的最好的事情就是模仿 std::multimap
签名 that is
template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class multimap;
你可以这样写class
template <typename K, typename V,
typename C = std::less<K>,
typename A = std::allocator<std::pair<K const, V>>>
class multimap_util
{
private:
std::multimap<K, V, C, A>* map;
public:
multimap_util (std::multimap<K, V, C, A> & m) : map{&m}
{};
};
这适用于
std::multimap<int, int> m;
multimap_util<int, int> mu( m );
因为它等同于
std::multimap<int, int, std::less<int>, std::allocator<std::pair<int const, int>> m;
multimap_util<int, int, std::less<int>, std::allocator<std::pair<int const, int>> mu( m );
并且在您声明带有 3 或 4 个模板参数的 multimap_util
时也有效:永远是 4,但其中一些可以默认。
不幸的是你不能使用 C++17 或 C++20 因为从 C++17 开始可用 CTAD(Class 模板参数推导)所以你也可以写
std::multimap<int, int> m;
multimap_util mu( m ); // <-- CTAD at works
和所有模板参数,对于multimap_utils
,都是从m
参数推导出来的。
为了简化您的生活,您也可以在 C++11 中编写一个 make_multimap_util()
函数,如下所示
template <typename K, typename V, typename C, typename A>
multimap_util<K, V, C, A> make_multimap_util (std::multimap<K, V, C, A> & m)
{ return {m}; }
因此,利用 auto
占位符的强大功能,您可以简单地编写
std::multimap<int, int> m;
auto mu = make_multimap_util(m);
和 mu
变成了 multimap_util<int, int>
或者,它是一回事, multimap_util<int, int, std::less<int>, std::allocator<std::pair<int const, int>>
.