The goal of these exercises is to get some feeling about the possibilities offered by the C++ language to perform computations at compile-time.
Exercise 1
Take the pi
function in pi_time.cpp
and make it constexpr
Look at the assembly (the easiest is to copy&paste the code into Compiler Explorer) and verify that there is no computation performed at runtime.
Exercise 2
Implement a constexpr
function that checks if a number is prime.
Like before, look at the assembly and verify that there is no computation
performed at runtime for a value known statically (i.e. known at compile
time): the value can be either a literal or the result of another constexpr
computation.
Check that it’s possible to call the function with a value not known statically, e.g. one that is asked on the standard input.
Exercise 3
Take containers_assoc.cpp
and extend it to cover also the use of the std::set
and std::unordered_set
associative containers. To fill the associative
containers you can simply insert all the numbers from 0 to N, without random
generation and without advancing.
In order to dispatch to the correct implementation you can use the
is_associative
trait already included in that file, using it either as a tag
or in a constexpr-if.
Exercise 4
Construct a compile-time table corresponding to a Pascal’s Triangle of N rows, where N is a compile-time constant.
Look at the assembly and verify that there is no computation performed at runtime for a statically-known value of a certain position, but that it’s also possible to access the value for a position obtained at runtime, e.g. from standard input.