Tricks

title: C++ Tricks tags:

  • C++

  • Tricks

    categories:

  • C++

Shuffle

static void shuffle(vector<int>* v) {
  srand(9);
  for (int n = v->size(); n >= 2; n--) {
    swap((*v)[n - 1], (*v)[static_cast<unsigned>(rand()) % n]);
  }
}

class 成员初始化

$ cat 010.cpp 
#include <iostream>

using namespace std;

class Plm {
    public:
    struct  Arg {
        size_t net;
        size_t mem;
        size_t query;
    };
};

int main() {
    Plm::Arg arg {
        .net = 1,
        .mem = 3,
        .query = 2
    };
    cout << arg.net << " " << arg.mem << " " << arg.query << endl;
    return 0;
}
$ g++ 010.cpp && ./a.out 
1 3 2

parameter pack

template<typename... Arguments>
void SampleFunction(Arguments... parameters);

// equals to

template<typename T, typename U>
void SampleFunction(T param1, U param2);
bovenson@Dell:~/Git/notes/C++/Code/Learn$ cat 005.cpp 
#include <iostream>

using namespace std;

void fa(int a, int b) {
    cout << a << " " << b << endl;
}

template<typename... Args>
void f(Args... args) {
    fa((args)...);
    fa(args...);
    fa(std::forward<Args>(args)...);
    // fa(std::forward<Args>((args)...)); // ERROR
}


int main() {
    f<int, int>(1, 2);     // OK
    f(1, 2);            // OK
    return 0;
}
bovenson@Dell:~/Git/notes/C++/Code/Learn$ g++ 005.cpp  && ./a.out 
1 2
1 2
1 2
1 2
1 2
1 2
MBP:Learn sunzhenkai$ cat 16.cpp
#include <iostream>
#include <vector>

using namespace std;

template <typename... T>
void f(T... args) {
    std::vector<int> v = { args... };
    for (auto item : v) {
        std::cout << item << std::endl;
    }
}

int main() {
    f(1, 2, 3, 4, 5);
    return 0;
}
MBP:Learn sunzhenkai$ g++ 16.cpp -std=c++11 && ./a.out
1
2
3
4
5

完美转发

无论是T&&、左值引用、右值引用,std::forward都会依照原来的类型完美转发。

省略号语法

Amazing

MBP:Learn sunzhenkai$ cat 15.cpp
#include <iostream>

using namespace std;

class A { };

class B {
    public:
    B(A a) {}
};

void fun(B b) {
    cout << "OK? OK!" << endl;
}

int main() {
    A a;
    fun(a);
    return 0;
}
MBP:Learn sunzhenkai$ g++ 15.cpp && ./a.out
OK? OK!

最后更新于

这有帮助吗?