2

我的班上有这个 ifdef typedef:

#ifdef HASHMAP
    typedef std::unordered_map<unsigned int, L1Entry> L1; //C++ 11 only
#else
    typedef std::map<unsigned int, L1Entry> L1;
#endif

当我创建类的新对象时,我需要控制使用什么容器。这样做的最佳方法是什么?

4

2 回答 2

6

使容器成为类的模板参数:

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::mapor 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;
}
于 2013-08-08T06:46:17.267 回答
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
于 2013-08-08T06:50:49.153 回答