gpt4 book ai didi

c++ - 为什么这个 traits 类不起作用,无法测试一个类是否具有特定的 typedef?

转载 作者:行者123 更新时间:2023-11-30 02:46:21 25 4
gpt4 key购买 nike

编辑:

好吧,我明白了。我用的是 false_typetrue_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 的结构在 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 is not a map type T is not a map type

我做错了什么?为什么是test(typename C::key_type*)甚至没有用于 map ,它确实有一个 key_type ?或者是我使用 decltype 的问题?

还有额外的好处:有什么调试技巧吗?我如何检查特化是如何选择的,甚至在编译时获得关于扩展的验证?也许有 VS 特定的扩展或编译时调试工具?

最佳答案

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

制作它:

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

它会起作用

关于c++ - 为什么这个 traits 类不起作用,无法测试一个类是否具有特定的 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23650310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com