编辑:
好的,我想通了。我使用false_type
andtrue_type
作为enable_if
我应该何时使用bool
. :X
此外,我已经决定一个is_map_like
班级会更好地检查是否value_type
像,std::pair<const Tkey, Tmapped>
。因此,我的新特征类如下所示:
template<class Tcontainer>
struct is_map_like
{
private:
template<class TvalueType>
struct test
{
static const bool bvalue = false;
};
template<class TkeyType, class TmappedType>
struct test<std::pair<const TkeyType, TmappedType>>
{
static const bool bvalue = true;
};
public:
static const bool bvalue = test<typename Tcontainer::value_type>::bvalue;
};
我想创建一个is_map_like
类型特征类来检查key_type
和mapped_type
。我很难建立这个。现在我只想检查key_type
. 到目前为止,我有以下内容:
template<class T>
struct is_map_like
{
private:
template<typename C> static std::true_type test(typename C::key_type*);
template<typename C> static std::false_type test(...);
public:
typedef decltype(test<T>(0)) value;
};
value
这里似乎总是回归false_type
。据我了解,SFINAE 应该允许我test
根据是否C::key_type
可访问来选择正确的重载。
以下是我的测试方式:首先,一个专门使用enable_if
on的结构is_map_like
:
// a class that will be specialized only for map-like types
template<class T, class Enable = void>
struct MyStruct
{
static void fn() { DebugLog(L"T is not a map type"); }
};
template<class T>
struct MyStruct<T, typename std::enable_if<is_map_like<T>::value>::type>
{
static void fn() { DebugLog(L"T is INDEED a map type"); }
};
这是我在运行时的调用方式:
void test_is_map()
{
MyStruct<std::vector<int>>::fn();
MyStruct<std::map<int, int>>::fn();
}
输出:
T 不是地图类型 T 不是地图类型
我究竟做错了什么?为什么 the test(typename C::key_type*)
even for the map
, which 确实有 a不使用key_type
?还是我使用的问题decltype
?
还有额外的好处:有任何调试技术吗?我如何检查如何选择专业化,甚至在编译时获得关于扩展的验证?也许有特定于 VS 的扩展或编译时调试工具?