Skip to content

Commit

Permalink
最卢的瑟's homework
Browse files Browse the repository at this point in the history
  • Loading branch information
Corgile committed Apr 4, 2024
1 parent 53f3a8b commit 6f8a44c
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ node_modules
/public
/resources
go.sum
cmake-build
24 changes: 24 additions & 0 deletions src/群友提交/第01题/brian.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// loser_homework / brian.cpp
// Created by brian on 2024 Apr 03.
//

#include <vector>
#include <functional>
#include <iostream>
#include <algorithm>

template<typename T, typename Func>
requires std::invocable<Func, T&>
std::vector<T>& operator|(std::vector<T>& vec, Func const& func) {
std::ranges::for_each(vec, func);
return vec;
}


int main() {
std::vector v{1, 2, 3};
std::function f{[](const int& i) { std::cout << i << ' '; }};
auto f2 = [](int& i) { i *= i; };
v | f2 | f;
}
34 changes: 34 additions & 0 deletions src/群友提交/第04题/brian.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// loser_homework / brian.cpp
// Created by brian on 2024 Apr 03.
//
#include<iostream>

class ComponentBase {
protected:
static inline std::size_t component_type_count = 0;
};

template<typename T>
class Component : public ComponentBase {
public:
static size_t component_type_id() {
static size_t unique_id = component_type_count++;
return unique_id;
}
};

class A : public Component<A> {};

class B : public Component<B> {};

class C : public Component<C> {};

int main() {
std::cout << A::component_type_id() << std::endl;
std::cout << B::component_type_id() << std::endl;
std::cout << B::component_type_id() << std::endl;
std::cout << A::component_type_id() << std::endl;
std::cout << A::component_type_id() << std::endl;
std::cout << C::component_type_id() << std::endl;
}
86 changes: 86 additions & 0 deletions src/群友提交/第05题/brian.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
//
// loser_homework / scope_guard.cpp
// Created by brian on 2024 Apr 03.
//
#include <cstdio>
#include <cassert>

#include <stdexcept>
#include <functional>

struct X {
X() { puts("X()"); }

X(const X&) { puts("X(const X&)"); }

X(X&&) noexcept { puts("X(X&&)"); }

~X() { puts("~X()"); }
};

struct scope_guard {
template<typename F, typename... A>
requires std::invocable<F, A...>
scope_guard(F&& func, A&& ...args) {
gc = [&func, &args...]() mutable {
/**
* @brief https://en.cppreference.com/w/cpp/utility/functional/invoke
* invoke: 如果\p func 是成员函数, 则\p ...args 的第一个参数是对应的对象(\p &,* )
*/
std::invoke(std::forward<F>(func), args...);
};
}
~scope_guard() { gc(); }
scope_guard(const scope_guard&) = delete;
scope_guard& operator=(const scope_guard&) = delete;

private:
std::function<void()> gc;
};


int main() {
{
// scope_guard的作用之一,是让各种C风格指针接口作为局部变量时也能得到RAII支持
// 这也是本题的基础要求
FILE* fp = nullptr;
try {
fp = fopen("test.txt", "a");
auto guard = scope_guard([&] {
fclose(fp);
fp = nullptr;
});

throw std::runtime_error{"Test"};
} catch (std::exception& e) {
puts(e.what());
}
assert(fp == nullptr);
}
puts("----------");
{
// 附加要求1,支持函数对象调用
struct Test {
void operator()(X* x) {
delete x;
}
} t;
auto x = new X{};
auto guard = scope_guard(t, x);
}
puts("----------");
{
// 附加要求2,支持成员函数和std::ref
auto x = new X{};
{
struct Test {
void f(X*& px) {
delete px;
px = nullptr;
}
} t;
auto guard = scope_guard{&Test::f, &t, std::ref(x)};
}
assert(x == nullptr);
}
}
5 changes: 5 additions & 0 deletions src/群友提交/第06题/brian.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
为保证atomic对象的原子性,复制和移动都是不允许的。

C++17之前 `std::atomic<int> n = 6;`不合法是因为atomic只支持列表初始化, 写成 `std::atomic<int> n = {6};`就可以通过编译了;

Check failure on line 3 in src/群友提交/第06题/brian.md

View workflow job for this annotation

GitHub Actions / check

Trailing spaces

src/群友提交/第06题/brian.md:3:95 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1] https://github.com/DavidAnson/markdownlint/blob/v0.33.0/doc/md009.md

17+之后的`std::atomic<int> n = 6;`其实是原地构造,合法。

Check failure on line 5 in src/群友提交/第06题/brian.md

View workflow job for this annotation

GitHub Actions / check

Files should end with a single newline character

src/群友提交/第06题/brian.md:5:42 MD047/single-trailing-newline Files should end with a single newline character https://github.com/DavidAnson/markdownlint/blob/v0.33.0/doc/md047.md

0 comments on commit 6f8a44c

Please sign in to comment.