1

编辑:

好的,我想通了。我使用false_typeandtrue_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_typemapped_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_ifon的结构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 的扩展或编译时调试工具?

4

1 回答 1

3

SFINAE 结构中的值是一个类型。

做了:

static constexpr bool value = decltype(test<T>(0))::value;

它会起作用

于 2014-05-14T09:36:51.373 回答