如何使用许多模板参数简化表示法,并在C++的另一个模板类中使用它
How to simplify notation with many template arguments and use it in another template class in C++
我想使用谷歌哈希映射哪个声明是
template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
class dense_hash_map { ... };
并将此模板类作为另一个模板类中的参数之一,例如
template<template<class Key, class T, class HashFcn, class EqualKey, class Alloc > class GoogleHashTable, class SomeOtherClass>
class MyClass { };
我想将previos符号简化为这样的东西
template<GoogleTemplate class GoogleHashTable, class SomeOtherClass>
但是如何将GoogleTemplate
定义为
template<class Key, class T, class HashFcn, class EqualKey, class Alloc >
在 C++11 中,
template <template <typename...> class GoogleHashTable, class SomeOtherClass>
否则
template <
template <typename, typename, typename, typename> class GoogleHashTable,
class SomeOtherClass
>
现在,您想要额外的简化,例如在 C++11 中
template <template <typename...> class F>
struct temp
{
template <typename... A>
using map = F <A...>;
};
template <class G, class SomeOtherClass>
class MyClass
{
template <typename... A>
using GoogleHashTable = G::template map <A...>;
};
这进一步简化了MyClass
的声明,但如果你想像往常一样使用模板GoogleHashTable
,而不需要::template map
的东西,则需要在其定义中有一个额外的模板别名。
另外,要使用 MyClass
,您现在必须编写
MyClass <temp <GoogleHashTable>, SomeOtherClass>
而不是
MyClass <GoogleHashTable, SomeOtherClass>
当然,除非你
typedef temp <GoogleHashTable> /*some name*/;
编辑
在 C++03 或更早
: template <template <typename, typename, typename, typename> class F>
struct temp4
{
template <typename A1, typename A2, typename A3, typename A4>
struct map { typedef F <A1, A2, A3, A4> type; };
};
同样,temp1
、temp2
、temp3
等。然后在您的班级中:
template <class G, class SomeOtherClass>
class MyClass
{
// now GoogleHashTable <A1, A2, A3, A4>
// is expressed as typename G::template map <A1, A2, A3, A4>::type
};
这不太方便,但是如果您在MyClass
中的某个点固定了A1, A2, A3, A4
参数,则
typedef typename G::template map <A1, A2, A3, A4>::type Table;
将为您节省大量打字时间。
在 C++11 中,您可以使用using
指令做很多事情。请参阅此讨论。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口