Exercises: Add template meta programming exercises
This commit is contained in:
parent
353e06c941
commit
b0d7d6b5fa
@ -251,3 +251,76 @@ It could look like this:
|
|||||||
Destruction of second plugin
|
Destruction of second plugin
|
||||||
|
|
||||||
*Hint:* Have a look at the related man-pages *dlopen(3)* and *dlsym(3)*.
|
*Hint:* Have a look at the related man-pages *dlopen(3)* and *dlsym(3)*.
|
||||||
|
|
||||||
|
## Task 17
|
||||||
|
|
||||||
|
Take your vector from Task 14 and implement componentwise addition via `operator+` on your vector.
|
||||||
|
Support implicit type conversions: `MyVector<int>{} + MyVector<double>{}` yields a `MyVector<double>`.
|
||||||
|
|
||||||
|
*Hint:* Look into `decltype` and `std::declval`.
|
||||||
|
|
||||||
|
## Task 18
|
||||||
|
|
||||||
|
You are given the following code snippet of a mathematical vector.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
template <std::size_t N>
|
||||||
|
class Vector {
|
||||||
|
public:
|
||||||
|
/* ... */
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::array<double, N> data;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Find an elegant way to provide the following interface:
|
||||||
|
|
||||||
|
- On default construction (no arguments), all elements are initialized to zero.
|
||||||
|
- Besides copy / move semantics, there is only one additional constructor which takes *exactly* `N` `double`s to initialize `data`.
|
||||||
|
- Accessing elements via the subscript operator `operator[]`.
|
||||||
|
- Members `.x`, `.y`, `.z` access `data[0]`, `data[1]`, `data[2]` respectively:
|
||||||
|
- With `N == 1` there should be only `.x` available.
|
||||||
|
- With `N == 2` there should be `.x` and `.y` available.
|
||||||
|
- With `N == 3` there should be `.x`, `.y`, and `.z` available.
|
||||||
|
|
||||||
|
Add a few tests to ensure correct behavior using the following aliases:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using Vec1 = Vector<1>;
|
||||||
|
using Vec2 = Vector<2>;
|
||||||
|
using Vec3 = Vector<3>;
|
||||||
|
```
|
||||||
|
|
||||||
|
*Note:* You are allowed to modify the given snippet as necessary.
|
||||||
|
|
||||||
|
## Task 19
|
||||||
|
|
||||||
|
Revisit the meta programming example from the lecture regarding `std::tuple`.
|
||||||
|
|
||||||
|
Given the following class template:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
template <typename... Types>
|
||||||
|
class type_set {};
|
||||||
|
```
|
||||||
|
|
||||||
|
`type_set` should behave like a set of types.
|
||||||
|
The empty set would therefore be `type_set<>`, while the set containing the type `int` would be `type_set<int>`, so on and so forth.
|
||||||
|
|
||||||
|
- Create a meta function `type_set_contains_v` which checks if a given `type_set` contains a given type.
|
||||||
|
- Create a meta function `type_set_is_subset_v` which checks if a given `type_set` is a subset of another given `type_set`.
|
||||||
|
- Create a meta function `type_set_is_same_v` which checks if a given `type_set` is equal to another given `type_set`.
|
||||||
|
- Create a meta function `type_set_size_v` which tells the size of a given `type_set`.
|
||||||
|
For `type_set<int, int, float>` it should return 2.
|
||||||
|
|
||||||
|
Try not to use any of the utilities provided by the standard library (like the example provided in the lecture).
|
||||||
|
|
||||||
|
*Hint:* If you are struggling with this exercise you might want to have a look at how *fold* (i.e. *reduce*) is used in functional programming languages.
|
||||||
|
|
||||||
|
## Task 20
|
||||||
|
|
||||||
|
Revisit the *Advanced Template* slides.
|
||||||
|
|
||||||
|
Go through the `has_print_to` example from the slides step by step.
|
||||||
|
Explain all parts like it's done in the lecture.
|
||||||
|
Loading…
Reference in New Issue
Block a user