Add little features topic
This commit is contained in:
parent
8410f097e2
commit
585965ec7c
1
topic/little_features/.gitignore
vendored
Normal file
1
topic/little_features/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build*
|
13
topic/little_features/CMakeLists.txt
Normal file
13
topic/little_features/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(little_features CXX)
|
||||
|
||||
file(GLOB srcs *.cpp)
|
||||
foreach(src IN LISTS srcs)
|
||||
get_filename_component(exe ${src} NAME_WE)
|
||||
add_executable(${exe} ${src})
|
||||
target_compile_features(${exe} PRIVATE cxx_std_17)
|
||||
set_target_properties(${exe} PROPERTIES CXX_EXTENSIONS OFF)
|
||||
target_compile_options(${exe} PRIVATE
|
||||
$<$<CXX_COMPILER_ID:GNU,Clang,AppleClang>:-Wall -Wextra -pedantic>)
|
||||
target_link_libraries(${exe} -ltbb)
|
||||
endforeach()
|
19
topic/little_features/conversion_operator.cpp
Normal file
19
topic/little_features/conversion_operator.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
#include <cassert>
|
||||
|
||||
struct Vec3 {
|
||||
float x, y, z;
|
||||
};
|
||||
|
||||
struct Vec2 {
|
||||
float x, y;
|
||||
operator Vec3() const { return Vec3{x, y, 0}; }
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
Vec2 v2{1, 2};
|
||||
|
||||
Vec3 v3 = v2;
|
||||
|
||||
assert(v3.x == 1 && v3.y == 2 && v3.z == 0);
|
||||
}
|
15
topic/little_features/execution_policy.cpp
Normal file
15
topic/little_features/execution_policy.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <execution>
|
||||
#include <iostream>
|
||||
|
||||
int main()
|
||||
{
|
||||
std::vector<int> numbers;
|
||||
for (auto i = 0; i < 1000; i++) {
|
||||
numbers.push_back(i);
|
||||
}
|
||||
|
||||
// Output should be malformed since there is no synchronization in place.
|
||||
std::for_each(std::execution::par, numbers.begin(), numbers.end(), [](int i) { std::cout << i << "\n"; });
|
||||
}
|
23
topic/little_features/placement_new.cpp
Normal file
23
topic/little_features/placement_new.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
struct Point {
|
||||
Point(float x, float y) : x(x), y(y) { std::cout << "Constructed at address: " << this << "\n"; }
|
||||
~Point() { std::cout << "Deconstructed at address: " << this << "\n"; }
|
||||
float x, y;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
auto memory = malloc(sizeof(Point));
|
||||
|
||||
// Construct a point at a specific location.
|
||||
Point *p = new (memory) Point(1.0f, 2.0f);
|
||||
|
||||
std::cout << "x: " << p->x << "\n";
|
||||
|
||||
// Need to manually invoke the destructor.
|
||||
p->~Point();
|
||||
|
||||
free(memory);
|
||||
}
|
59
topic/little_features/pointer_to_member.cpp
Normal file
59
topic/little_features/pointer_to_member.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
#include <cassert>
|
||||
|
||||
struct Point {
|
||||
float x, y;
|
||||
};
|
||||
|
||||
struct Rect {
|
||||
Point tl, br;
|
||||
float area() const { return (br.x - tl.x) * (br.y - tl.y); }
|
||||
};
|
||||
|
||||
class IShape {
|
||||
public:
|
||||
virtual float area() const { assert(false); };
|
||||
virtual ~IShape() {}
|
||||
};
|
||||
|
||||
class Square : public IShape {
|
||||
public:
|
||||
Square(float extend) : m_extend(extend) {}
|
||||
float area() const override { return m_extend * m_extend; }
|
||||
|
||||
private:
|
||||
float m_extend;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
Rect r1{{1, 1}, {4, 4}};
|
||||
assert(r1.area() == 9.0f);
|
||||
|
||||
Rect *r1_ptr = &r1;
|
||||
assert(r1_ptr->area() == 9.0f);
|
||||
|
||||
// member variable pointer
|
||||
auto tl_mem_ptr = &Rect::tl; // Point Rect::*tl_mem_ptr
|
||||
|
||||
assert((r1.*tl_mem_ptr).x == 1.0f);
|
||||
|
||||
assert((r1_ptr->*tl_mem_ptr).x == 1.0f);
|
||||
|
||||
// member function pointer
|
||||
auto area_memfn_ptr = &Rect::area; // float (Rect::*area_memfn_ptr)() const
|
||||
|
||||
assert((r1.*area_memfn_ptr)() == 9.0f);
|
||||
|
||||
assert((r1_ptr->*area_memfn_ptr)() == 9.0f);
|
||||
|
||||
// Virtual
|
||||
Square square{2.0f};
|
||||
IShape *shape_ptr = □
|
||||
|
||||
// virtual member function pointer
|
||||
auto virt_area_memfn_ptr = &IShape::area; // float (IShape::*virt_area_memfn_ptr)() const
|
||||
|
||||
assert((square.*virt_area_memfn_ptr)() == 4.0f);
|
||||
|
||||
assert((shape_ptr->*virt_area_memfn_ptr)() == 4.0f);
|
||||
}
|
Loading…
Reference in New Issue
Block a user