modern c++ 教程总结(imgui+glfw+opengl+glad)
发布人:shili8
发布时间:2025-02-08 08:08
阅读次数:0
**Modern C++ 教程总结**
在本教程中,我们将使用 Modern C++ 的特性,结合 ImGui、GLFW、OpenGL 和 GLAD 等库,创建一个简单的窗口应用程序。我们将重点介绍以下内容:
* 使用 Modern C++ 的特性(C++14/C++17)
*介绍 ImGui 库及其基本用法* 使用 GLFW 库进行窗口管理和事件处理* OpenGL 和 GLAD 库的使用**环境准备**
首先,我们需要安装必要的库:
* **ImGui**: 可以从 [ 下载源码并编译。
* **GLFW**: 可以从 [ 下载源码并编译。
* **OpenGL**: 通常在系统中已经安装,或者可以使用包管理器(如 Homebrew 或 apt-get)进行安装。
* **GLAD**: 可以从 [ 下载源码并编译。
**Modern C++ 的特性**
在 Modern C++ 中,我们可以使用以下特性:
### 智能指针
cpp#includeclass MyClass { public: MyClass() { std::cout << "MyClass constructed." << std::endl; } ~MyClass() { std::cout << "MyClass destroyed." << std::endl; } private: int data; }; int main() { // 使用unique_ptr std::unique_ptr ptr = std::make_unique (); // 使用shared_ptr std::shared_ptr sharedPtr = std::make_shared (); return0; }
### auto 和 decltype
cpp#include <iostream> int main() { int x =5, y =10; // 使用auto auto sum = x + y; std::cout << "sum: " << sum << std::endl; // 使用decltype decltype(x) product = x * y; std::cout << "product: " << product << std::endl; return0; }
### lambda 表达式
cpp#include <iostream> #include <vector> int main() { // 使用lambda表达式 auto printVector = [](const std::vector<int>& vec) { for (const auto& element : vec) { std::cout << element << " "; } std::cout << std::endl; }; std::vector<int> numbers = {1,2,3,4,5}; printVector(numbers); return0; }
### range-based for
cpp#include <iostream> #include <vector> int main() { // 使用range-based for std::vector<int> numbers = {1,2,3,4,5}; for (const auto& number : numbers) { std::cout << number << " "; } std::cout << std::endl; return0; }
### move semantics
cpp#include <iostream> #include <vector> class MyClass { public: MyClass() { std::cout << "MyClass constructed." << std::endl; } private: int data; }; int main() { // 使用move语义 MyClass obj1, obj2; obj1 = std::move(obj2); return0; }
### constexpr
cpp#include <iostream> constexpr int add(int a, int b) { return a + b; } int main() { // 使用constexpr constexpr int sum = add(5,10); std::cout << "sum: " << sum << std::endl; return0; }
### if constexpr
cpp#include <iostream> template <typename T> void printType(T) { std::cout << "T is a class type." << std::endl; } int main() { // 使用if constexpr if constexpr (std::is_class_v<int>) { printType(5); } else { std::cout << "T is not a class type." << std::endl; } return0; }
### fold expressions
cpp#include <iostream> template <typename... Args> void printArgs(const Args&... args) { ((std::cout << args << " "), ...); } int main() { // 使用fold expressions int x =5, y =10; double z =3.14; printArgs(x, y, z); return0; }
### std::variant
cpp#include <iostream> #include <variant> std::variant<int, double> getVariant(int value) { return value; } int main() { // 使用std::variant int x =5; auto variant = getVariant(x); if (std::holds_alternative<int>(variant)) { std::cout << "variant is an integer." << std::endl; } else if (std::holds_alternative<double>(variant)) { std::cout << "variant is a double." << std::endl; } return0; }
### std::any
cpp#include <iostream> #include <any> void printAny(const std::any& any) { if (std::any_cast<int>(&any)) { std::cout << "any is an integer." << std::endl; } else if (std::any_cast<double>(&any)) { std::cout << "any is a double." << std::endl; } } int main() { // 使用std::any int x =5; printAny(x); return0; }
### std::optional
cpp#include <iostream> #include <optional> void printOptional(const std::optional<int>& optional) { if (optional.has_value()) { std::cout << "optional is an integer." << std::endl; } else { std::cout << "optional is empty." << std::endl; } } int main() { // 使用std::optional int x =5; printOptional(std::nullopt); return0; }
### std::span
cpp#include <iostream> #include <span> void printSpan(const std::span<int>& span) { for (const auto& element : span) { std::cout << element << " "; } std::cout << std::endl; } int main() { // 使用std::span int x =5, y =10; printSpan({x, y}); return0; }
### std::format
cpp#include <iostream> #include <format> void printFormat(const char* format, ...) { std::cout << std::vformat(format, va_list{}); } int main() { // 使用std::format int x =5; printFormat("x is an integer: %d", x); return0; }
### std::string_view
cpp#include <iostream> #include <string_view> void printStringView(const std::string_view& string) { std::cout << string << std::endl; } int main() { // 使用std::string_view const char* str = "Hello, World!"; printStringView(str); return0; }
### std::source_location
cpp#include <iostream> #include <source_location> void printSourceLocation(const std::source_location& location) { std::cout << "File: " << location.file_name() << ", Line: " << location.line() << std::endl; } int main() { // 使用std::source_location printSourceLocation(std::source_location{}); return0; }
### std::format_context
cpp#include <iostream> #include <format> void printFormatContext(const std::format_context& context) { std::cout << "Format Context: " << context.format() << std::endl; } int main() { // 使用std::format_context const char* format = "Hello, %s!"; printFormatContext(std::format_context{format}); return0; }
### std::formatter
cpp#include <iostream> #include <format> void printFormatter(const std::formatter<int>& formatter) { std::cout << "Formatter: " << formatter.format(5) << std::endl; } int main() { // 使用std::formatter int x =5; printFormatter(std::formatter<int>{}); return0; }
### std::format_parse_context
cpp#include <iostream> #include <format> void printFormatParseContext(const std::format_parse_context& context) { std::cout << "Format Parse Context: " << context.format() << std::endl; } int main() { // 使用std::format