目录
1. 限制模板函数的模板参数类型
2. CRTP (Curiously Recurring Template Pattern)
3. 元编程+insights
4. 完美转发
5. 工厂模式
6. Lamdba表达式
7. RAII – 自动释放资源
8. 其它小伎俩
1. 限制模板函数的模板参数类型
#include
#include
// Expected class type
class MyClass {};
// Function template using std::enable_if to check if the type is MyClass
template
typename std::enable_if::value, void>::type
checkType() {
std::cout (); // Won't compile, int is not MyClass
checkType(); // Will compile and print "Type is MyClass"
return 0;
}
2. CRTP (Curiously Recurring Template Pattern)
template
struct Base {
void interface() {
static_cast(this)->implementation();
}
};
struct Derived : Base {
void implementation() {
// Implementation details
}
};
// Usage
Derived d;
d.interface(); // Calls Derived::implementation()
CRTP + std::enable_shared_from_this
class Test: public std::enable_shared_from_this
{
std::shared_ptr GetPtr(){
return shared_from_this();
}
static std::shared_ptr Create(){
return std::shared_ptr(new Test());
}
private://imply constructor, so you couldn't create a object pointed by Test*
Test() 服务器托管网= default;
};
3. 元编程+insights
template
struct Factorial {
static const int value = N * Factorial::value;
};
template
struct Factorial {
static const int value = 1;
};
// Usage
int result = Factorial::value; // result = 120
元编程不易理解,有个在线平台可以看到模板展开的样子
4. 完美转发
#include
#include
void process(int& value) {
std::cout
void forward(T&& value) {
process(std::forward(value));
}
// Usage
int a = 5;
forward(a); // Output: L-value reference: 5
forward(10); // Output: R-value reference: 10
5. 工厂模式
#include
class Product {
public:
virtual void printInfo() = 0;
};
class Concre服务器托管网teProduct : public Product {
public:
void printInfo() override {
std::cout
6. Lamdba表达式
#include
void exampleLambda() {
int increment = 5;
auto addIncrement = [increment](int x) { return x + increment; };
std::cout
7. RAII – 自动释放资源
#include
#include
#include
#include
class FileResource {
public:
explicit FileResource(const std::string& filename)
: fileStream(filename) {
if (!fileStream.is_open()) {
throw std::runtime_error("Unable to open file");
}
std::cout
此思想经常用来加解锁。
8. 其它小伎俩
int mi = std::min({x1, x2, x3, x4});
#include //all headers in one
auto
emplace_back is better than push_back
std::tuple tp = std::make_tuple(1,'a',"bc");
std::cout(tp);
auto [i,c,s] = tp; //c++17
//deep copy
std::copy_n(arr1,n,arr2);
std::all_of
std::any_of
std::none_of
未完待续。。。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 【译】使用.NET将WebAssembly扩展到云(二)
原文 | Richard Lander 翻译 | 郑子铭 轻量级功能 嗯……但是如果我们使用 Wasm 更像是一个典型的功能而不是一个应用程序,我们可能不会计算一百万个单词,而是做一些更轻量级的事情。让我们重新运行比较,但使用最小的文件。 通过 Wasm,使用…