C++两个is_union_or_class实现
C++ two is_union_or_class implementations
我尝试实现is_union_or_class
,首先没有使用以下方法void_t
:
#include <type_traits>
namespace detail {
template <class T>
struct is_union_or_class_helper1 : public std::false_type { };
template <class T>
struct is_union_or_class_helper1<char T::*> : public std::true_type { };
}
template <class T>
struct is_union_or_class1 : public detail::is_union_or_class_helper1<T> { };
然后我使用虚拟空类对其进行了测试,value
成员评估为false
.然后我使用如下void_t
重试:
#include <type_traits>
template <class...>
using void_t = void;
namespace detail {
template <class T, class = void_t<T>>
struct is_union_or_class_helper2 : public std::false_type { };
template <class T>
struct is_union_or_class_helper2<T, void_t<char T::*>> : public std::true_type { };
}
template <class T>
struct is_union_or_class2 : public detail::is_union_or_class_helper2<T> { };
而这次它正确地评估为true
.为什么结果不同?两个帮助器在char T::*
是有效表达式的情况下都更专业,为什么只有第二种情况下的帮助程序从true_type
继承?以下是测试代码:
struct dummy_type { };
int main(int argc, char** argv) {
std::cout << is_union_or_class1<dummy_type>::value << "n";
std::cout << is_union_or_class2<dummy_type>::value << "n";
}
我编译了这段代码并使用 MSVC 2015 编译器进行了测试。
考虑一下:
is_union_or_class1<dummy_type>::value
dummy_type
不是指向要推断的类T
char 类型的数据成员的指针。换句话说,dummy_type
(让我说(与类型char T::*
不匹配,则放弃此专业化。
因此,选择类模板并从std::false_type
继承该类模板:
template <class T>
struct is_union_or_class_helper1 : public std::false_type { };
这样的东西会起作用:
template <class T, typename = T>
struct is_union_or_class_helper1 : public std::false_type { };
template <class T>
struct is_union_or_class_helper1<T, decltype((char T::*){}, T{})> : public std::true_type { };
这只不过是void_t
成语的另一种变体。
让我重写一下:
template <class T, typename = void>
struct is_union_or_class_helper1 : public std::false_type { };
template <class T>
struct is_union_or_class_helper1<T, decltype((char T::*){}, void())> : public std::true_type { };
就是这样,对于那些仍在等待 C++17 的人来说,void_t
成语的形式之一。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Allocating an object of abstract class type"错误,尽管所有函数都有实现
- 如何在C++实现继承并解决错误"parent class is not accessible base of child class"?
- 错误:尽管实现了所有虚拟功能,但仍"Allocating an object of abstract class type"
- 栈使用Struct或Class来实现其私有数据