代码原则
- class用于封装对变量的直接处理操作
- namespace 用于封装功能模块, 以及该功能模块里的拓展函数
- file 用于区分编译边界, 一个模块里可能会有好几个编译边界
这个很难说清楚
就地构造函数(C++11)
先分配好内存, 再运行构造函数, 最后以移动构造函数的方式把值传递回去
template <typename _T, typename ...Arg>
_T make_in_place(Arg&&... arg)
{
char mem[sizeof(_T)];
::new(mem)_T(std::forward<Arg>(arg)...);
return std::move(*reinterpret_cast<_T*>(mem));
}
std::invoke 的实现
传入函数指针以及函数参数, 然后就可以调用这个函数
template <typename _Func, typename ...Args>
void call_func(const _Func &func, Args&&... args)
{
std::forward<_Func>(func)(std::forward<Args>(args) ...);
}
左值调用(C++11)
class Cls
{
public:
void call() &; // 当前对象为左值时调用
void call() &&; // 当前对象为右值时调用
}