2017年7月10日月曜日

[C++] override すべき関数の名前 typo に気づける idiom

Google Test でテストのセットアップを定義する場合は、SetUp 関数をオーバーライドするのですが、これを Setup と間違えてしまう人が多いようです。
ただ、Google Test ではこの間違いにコンパイル時に気付けるようになってます。
その部分のコードがこちら

1
2
3
private:
  struct Setup_should_be_spelled_SetUp {};
  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }

override つけたらいいやんって話ですが、まぁ…つけない人もいるわけで…
そんな人でもすぐに間違いに気付けるのがこのイディオムです。

サンプルコード:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A
{
public:
    virtual void SetUp() {}
private:
  struct Setup_should_be_spelled_SetUp {};
  virtual Setup_should_be_spelled_SetUp* Setup() { return 0; }
};
 
class Override : public A
{
public:
    void Setup() override {}
    void setup() override {}
};
 
class NoOverride : public A
{
public:
    void Setup() {}
    void setup() {}
};
 
 
int main()
{
    return 0;
}
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ https://wandbox.org/permlink/jEs6OQf0t8tCkgzf



override 付けた方は当然 Setup も setup もコンパイルエラーになります。
一方、override 付けなかった方も Setup がコンパイルエラーになっています


いやー賢いですね。勉強になりました。

0 件のコメント:

コメントを投稿