我的班上有这个 ifdef typedef:
#ifdef HASHMAP
typedef std::unordered_map<unsigned int, L1Entry> L1; //C++ 11 only
#else
typedef std::map<unsigned int, L1Entry> L1;
#endif
当我创建类的新对象时,我需要控制使用什么容器。这样做的最佳方法是什么?
我的班上有这个 ifdef typedef:
#ifdef HASHMAP
typedef std::unordered_map<unsigned int, L1Entry> L1; //C++ 11 only
#else
typedef std::map<unsigned int, L1Entry> L1;
#endif
当我创建类的新对象时,我需要控制使用什么容器。这样做的最佳方法是什么?
使容器成为类的模板参数:
template<typename MapType>
class MyClass
{
public:
// ...
private:
MapType myMap;
};
你会像这样实例化:
MyClass< std::map<unsigned int, L1Entry> > obj;
MyClass< std::unordered_map<unsigned int, L1Entry> > obj2;
标准库中有一个容器可以做到这一点,看看std::queue默认情况下它是用 an 实现的,std::deque
但你可以指定另一个容器,只要这个容器提供某些操作。
这是另一个版本,您只需指定std::map
or std::unordered_map
:
#include <map>
#include <unordered_map>
typedef size_t L1Entry;
template<template <typename...> class Container>
class MyClass
{
typedef Container<int, L1Entry> MapType;
public:
// ...
private:
MapType myMap;
};
int main()
{
MyClass<std::map> obj;
MyClass<std::unordered_map> obj2;
}
好的!这是一个最终版本,向您展示如何在 .h/.cpp 中拆分代码(除我标记的部分外,所有内容都在 .h 中):
#ifndef MYMAP_H
#define MYMAP_H
#include <map>
#include <unordered_map>
#include <iostream>
typedef size_t L1Entry;
template<template <typename...> class Container>
class MyClass
{
typedef Container<int, L1Entry> MapType;
public:
void printMap();
private:
MapType myMap;
};
// START OF CPP CHUNK (replace with #include <whatever.h>)
template<template <typename...Args> class Container>
void MyClass< Container >::printMap()
{
// ... do the actual printing
std::cout << "You'd print stuff here." << std::endl;
}
// END OF CPP CHUNK
#endif // MYMAP_H
这将是 main.cpp:
#include "mymap.h"
int main()
{
MyClass<std::map> obj;
MyClass<std::unordered_map> obj2;
obj.printMap();
obj2.printMap();
return 0;
}
你是这个意思吗?
#ifdef __GXX_EXPERIMENTAL_CXX0X__ //Checks for C++11
typedef std::unordered_map<unsigned int, L1Entry> L1; //C++ 11 only
#else
typedef std::map<unsigned int, L1Entry> L1;
#endif