【发布时间】:2016-02-08 21:57:23
【问题描述】:
我正在尝试创建一个映射类,它会根据可能的值范围自动选择正确的实现。如果取值范围最大为 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 的成员。
【问题讨论】:
-
你定义
foo了吗? -
是的。
foo是为两个 Impl 类定义的 -
我也不能使用
size()、at()或operator[],即使这两种类型都有。
标签: c++ c++11 metaprogramming