std::is_constructible<T, Args>是如何实现的?
How is std::is_constructible<T, Args> implemented?
到目前为止我在网上找不到任何东西。对于一个学习项目,我想实现我自己的is_constructible。有人能解释一下它的工作原理吗?
From cppreference:
[I]如果变量定义
T obj(std::declval<Args>()...);
是良构的,则value
等于true
,否则value
等于false
。
检查代码是否格式良好可以通过SFINAE技术完成,例如void_t<>
技巧(预计将成为c++ 1z标准库的一部分):
template <class...>
using void_t = void;
template <class, class T, class... Args>
struct is_constructible_ : std::false_type {};
template <class T, class... Args>
struct is_constructible_<
void_t<decltype(T(std::declval<Args>()...))>,
T, Args...> : std::true_type {};
template <class T, class... Args>
using is_constructible = is_constructible_<void_t<>, T, Args...>;
using
跳圈是为了将void_t<>
参数放在首位。它通常与默认类型一起出现在最后,但该位置由可变的Args
包占据。
当is_constructible_
为<void, T, Args...>
实例化时,编译器会尝试先实例化专门化。这只有在void_t<...>
的内容在语义上有效的情况下才会成功,也就是说,T(std::declval<Args>()...)
可以正确执行——正如is_constructible
的要求中所指定的那样。请注意,我使用了临时变量而不是局部变量,但据我所知,两者之间的规则不会改变。专门化继承自std::true_type
,产生true
value
。
如果专门化不能被实例化(即T(std::declval<Args>()...)
无效),编译器会返回到通用模板,它总是可以被实例化的。这个继承自std::false_type
,产生false
value
。
Live on Coliru
更精确的特征,如std::is_trivially_constructible
,需要更高级的语言规则知识来制作表达,其有效性应该成为特征的价值。如果从语言内部证明这是不可行的,比如std::is_standard_layout
,那么编译器本身必须提供一个内部函数来检索值。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 如何自己为我自己的shared_ptr实现实现别名构造函数
- 这个UTF-8实现实现是定义的还是定义良好的
- 我的 PRNG 实现与我尝试复制的实现有何不同?