C++11:根据项目计数在 std::array 和 std::unordered_map 之间实现一个选择器

标签 c++ c++11 metaprogramming

我正在尝试创建一个映射类,它会根据可能的值范围自动选择正确的实现。如果值范围最大为 256,则使用 std::array,否则使用 std::unordered_map

template<typename KeyType, typename ValType>
class MapImpl : public std::unordered_map<KeyType,ValType>
{
  void foo() { std::cout << "Map foo" << std::endl; }
};

template<typename ValType, std::size_t Size>
class ArrImpl : public std::array<ValType,Size>
{
public:
  void foo() { std::cout << "Arr foo" << std::endl; }
};

template<typename KeyType, typename ValType,
         KeyType min_value = boost::integer_traits<KeyType>::const_min,
         KeyType max_value = boost::integer_traits<KeyType>::const_max>
class MappingSelector
{
public:
  void bar() { map.foo(); }
private:
  typedef std::conditional<(max_value-min_value < 256),
                           ArrImpl<ValType,max_value-min_value+1>,
                           MapImpl<KeyType,ValType>
                          > MappingType;
  MappingType map;
};

到目前为止一切顺利(?) 然后我实例化它:

MappingSelector<unsigned char, double> ms;
ms.bar();

但是,编译器似乎不喜欢这样,并告诉我我的 MappingType 没有名为 foo 的成员。

最佳答案

std::conditional不直接定义结果类型,但它定义了一个结构,该结构具有 typedef type,这是相应的类型。

这意味着你必须限定特定的类型,所以你的typedef应该是

typedef std::conditional<(max_value-min_value < 256),
ArrImpl<ValType,max_value-min_value+1>,
MapImpl<KeyType,ValType>
> MappingType;
typename MappingType::type map;
    ^ requires typename for unambiguation
                       ^ ::type is the real typedef

或者您可以通过使用 ::type 限定它来直接键入 def MappingType,结果相同。实际上,由于您使用的是 C++11,因此您还可以使用 using,例如:

using MappingType = typename std::conditional<(max_value-min_value < 256),
ArrImpl<ValType,max_value-min_value+1>,
MapImpl<KeyType,ValType>
>::type;

MappingType map;

关于C++11:根据项目计数在 std::array 和 std::unordered_map 之间实现一个选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35280139/

相关文章:

c++ - Visual Studio 2015 中的命令参数字段

C++ 在类中声明动态数组(无符号字符和结构)?

c++ - C++ 17 可以处理嵌套的可变参数模板吗?

c++ - 为什么我不能在带模板的派生类中使用基类的别名?

Ruby:扩展模块的地方

c++ - "Undefined Behavior"真的允许*任何*发生吗?

c++ - 从字符串文字初始化 char 数组

g++ 中的 C++11 链式构造合规性

c++ - 类似于 c++11 中的 boost::mpl::if_

c++ - 如何在模板元编程中使用 'default' 值