| static-assert/p5.cc - Illustration of of type functions in a number static assertions - all of which hold. | Lecture 6 - slide 31 : 40 Program 1 |
// Compiles without errors, meaning that all the static_asserts hold.
#include <iostream>
#include <string>
#include <type_traits>
class D {};
class E{
public:
virtual void vf(){};
};
int main(){
int a;
int &b = a;
int *c = &a;
D d;
E *ep;
std::remove_pointer<decltype(ep)>::type f; // Corresponds to E f;
f.vf(); // OK, because the type of f is E.
static_assert(std::is_integral<decltype(a)>::value, "type of a is expected to be integral");
static_assert(std::is_fundamental<decltype(a)>::value, "type of a is expected to be a fundamental type");
static_assert(std::is_reference<decltype(b)>::value, "type of b is expected to be a reference");
static_assert(std::is_lvalue_reference<decltype(b)>::value, "type of b is expected to be a lvalue reference");
static_assert(!std::is_rvalue_reference<decltype(b)>::value, "type of b is NOT expected to be a rvalue reference");
static_assert(std::is_pointer<decltype(c)>::value, "type of c is expected to be a pointer");
static_assert(std::is_class<decltype(d)>::value, "type of d is expected to be a class");
static_assert(std::is_polymorphic<E>::value, "E is expected to be polymorphic - it has a virtual function");
static_assert(std::is_polymorphic<std::remove_pointer<decltype(ep)>::type>::value,
"ep (without ptr) is expected to be polymorphic");
}