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

