Home > C++ > C++覚え書き

C++覚え書き

  • 2010-04-03 (土) 9:53
  • C++

北斗無双中です。

最近覚えた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,

マクロみたいなもんだな。これは便利かも知らん。

以上

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=563
Listed below are links to weblogs that reference
C++覚え書き from コスミー報告書[社外秘]

Home > C++ > C++覚え書き

Search
Feeds
Meta
 合計:000304
 今日:0022 昨日:0113

Return to page top