Tag: typetraits

用C ++ 17可以检测一个结构体/类是否有任何基数?

我需要一个types特征,如果给定的types是从任何东西派生的,那么这个特征将是真的,否则就是假的。 例如: template<class T> struct is_inherit //… logic of inheritance detection ; template<class T> void AppLogic(){ if constexpr(is_inherit<T>::value) { puts("T has base"); //… } else { puts("T doesn't have base"); //… } } struct A {}; struct C {}; struct B: C {}; int main() { AppLogic<A>(); // print: T doesn't have base AppLogic<B>(); // […]

如何在编译期间切换/selecttypes?

有没有一种标准的方式,我可以在编译时在c + + 11中的无符号索引select一个types? 例如,像这样的东西: using type_0 = static_switch<0,T,U>; // yields type T using type_1 = static_switch<1,T,U>; // yields type U 如果有一个可变模板版本,这将是非常有用的。

Eric Niebler如何实现std :: is_function?

上周,Eric Niebler为std::is_function traits类推送了一个非常紧凑的实现: #include <type_traits> template<int I> struct priority_tag : priority_tag<I – 1> {}; template<> struct priority_tag<0> {}; // Function types here: template<typename T> char(&is_function_impl_(priority_tag<0>))[1]; // Array types here: template<typename T, typename = decltype((*(T*)0)[0])> char(&is_function_impl_(priority_tag<1>))[2]; // Anything that can be returned from a function here (including // void and reference types): template<typename T, typename = […]

“is_base_of”如何工作?

以下代码如何工作? typedef char (&yes)[1]; typedef char (&no)[2]; template <typename B, typename D> struct Host { operator B*() const; operator D*(); }; template <typename B, typename D> struct is_base_of { template <typename T> static yes check(D*, T); static no check(B*, int); static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes); }; //Test sample class Base {}; […]

琐碎与标准的布局与POD

用通俗的话来说,平凡的types,标准的布局types和POD有什么区别? 具体来说,我想确定new T是否与任何模板参数T new T()不同。 我应该select哪种types的特征is_trivial , is_standard_layout和is_pod ? (作为一个侧面的问题,这些types的特性中的任何一个都可以在没有编译器的情况下实现?

为什么没有std :: is_structtypes的特征?

我已经看到,为了检查typesT是否是我可以使用的类: bool isClass = std::is_class<T>::value; 它对于类和结构都返回true。 我知道在C ++中它们几乎是一样的,但是我想知道为什么在types特征中它们之间没有区别。 检查这种差异总是无用的,还是有更多的理由我不明白?

有两个参数的decltype是什么?

编辑,为了避免混淆: decltype不接受两个参数。 查看答案。 在编译期间,可以使用以下两个结构来检查typesT上成员函数的存在: // Non-templated helper struct: struct _test_has_foo { template<class T> static auto test(T* p) -> decltype(p->foo(), std::true_type()); template<class> static auto test(…) -> std::false_type; }; // Templated actual struct: template<class T> struct has_foo : decltype(_test_has_foo::test<T>(0)) {}; 我认为这个想法是在检查成员函数的存在时使用SFINAE,所以在p->foo()无效的情况下,只定义返回std::false_type的test的椭圆版本。 否则,第一个方法被定义为T* ,并将返回std::true_type 。 实际的“开关”发生在第二个类中,它inheritance自test返回的types。 与is_same等不同的方法相比,这看起来很聪明和“轻量级”。 有两个参数的decltype首先让我感到惊讶,因为我认为它只是得到了一个expression式的types。 当我看到上面的代码时,我认为它是“试图编译expression式,并总是返回第二种types,如果expression式编译失败,则失败”(所以隐藏这个特殊化; SFINAE)。 但: 然后我想我可以用这个方法来写任何“有效的expression式”检查器,只要它依赖于某种types的T 例: … template<class T> static auto […]

检查可变参数的唯一性参数

我想variadic模板参数必须唯一。 我知道当多inheritance时,不允许相同的类inheritance。 struct A{}; struct B: A, A{}; // error 使用这个规则,我做了一个小小的代码。 #include <type_traits> template< class T> struct id{}; template< class …T> struct base_all : id<T> … {}; template< class … T> struct is_unique { template< class … U> static constexpr bool test( base_all<U…> * ) noexcept { return true; } template< class … U> static […]