北斗無双中です。
最近覚えたC++のメモ。
1.placement new
普通のnewはヒープからメモリ領域を取ってくるが、placement newはすでにある領域にコンストラクタを適用するためのものっぽい。
class Hoge
{
public:
int fuga;
Hoge(){}
Hoge(int val) {
fuga = val;
}
};
int main(int argc, char *argv[])
{
Hoge a;
Hoge *b;
b = new(&a) Hoge(100);
std::cout << b->fuga << std::endl;
std::cout << a.fuga << std::endl;
return 0;
}
100 100
となる。
new(メモリ領域のアドレス) コンストラクタ;
クラスの配列の各要素に引数付きコンストラクタを適用したいときとかに使えるな。
参考:http://marupeke296.com/TIPS_No13_ClassArrayInitialize.html
2.テンプレートに数字を渡す
普通はtypenameで型を渡すが数字も渡していいらしい。
template <int n>
int comp(const void *a, const void *b)
{
const int *na = static_cast<const int*>(a);
const int *nb = static_cast<const int*>(b);
if (n == 0) {
return *na - *nb;
} else {
return *nb - *na;
}
}
int main(int argc, char argv[]) {
int data[] = {0,1,2,3,4,5,6,7,8,9};
qsort(data, sizeof(data)/sizeof(int), sizeof(int), comp<1>);
for (int i = 0; i < sizeof(data)/sizeof(int); i++) {
std::cout << data[i] << ",";
}
std::cout << std::endl;
qsort(data, sizeof(data)/sizeof(int), sizeof(int), comp<0>);
for (int i = 0; i < sizeof(data)/sizeof(int); i++) {
std::cout << data[i] << ",";
}
std::cout << std::endl;
return 0;
}
9,8,7,6,5,4,3,2,1,0,
0,1,2,3,4,5,6,7,8,9,
マクロみたいなもんだな。これは便利かも知らん。
以上