いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

迷宮からのPre脱出

13日のログで、「コード弄るんじゃなかった…orz」と書き込んでいましたが、今日になってようやく出口が見えてきましたっ。今更かよ!! って感じですが、最近は曲の打ち込みばかりで、コーディングは全くやってなかったですからねぇ…。気づいたら2週間も経ってますね……あぅあぅ。orz
で、コーディングしていて1つ勉強になったこと。
概略で書いてしまいますが…

typedef const UINT CUINT;
typedef const SVertex CSVertex;
class CVertexBuff
{
public:
  template<UINT N>
  void Assign(CSVertex (&s)[N], CUINT nOffset = 0); // f1
  void Assign(CSVertex* pVArray, CUINT nArraySize, CUINT nOffset = 0); //f2
};
SVertex s[4] = {...}; // 適当に頂点初期化
CVertexBuff vb;
for(UINT i = 0; i < 10; ++i)
    vc.Assign(s, i * 4); // ※

こんなコードは駄目ということを学習しました。^^;
私としては、f1を呼びたかったのですが、どうもf2を呼び出しちゃうみたいです。コンパイルエラーもなしに。確かに動いているところを見ると、f2が呼ばれてしまうのも納得なんですけど、私としてはf1を呼びたいので…。う〜ん、どう対策しようかなぁ〜……。

ちなみにですが、

template<UINT N>
int Func(int (&na)[N]);

ってのは、Nに配列のサイズが勝手に入ってくれますので、いちいち配列のサイズを引数に持たなくて良いというテンプレート関数の書き方です。私的には中々便利だと感じていますので、オススメしたいところです。

なお、VC6じゃ動きません。^^;