天狗会議録
Posts Pages About

リーダブルコード

2024年11月30日読了

Credit

Scott Meyers. (2005). Effective C++: 55 Specific Ways to Improve Your Programs and Designs. Addison-Wesley Professional. 小林健一郎訳. (2006). Effective C++ 第3版 ―プログラムとデザインを改良するための55項目. 丸善出版.

Summary

C++プログラムを効率化するテクニックを解説した本。

というよりは、C++の自由度ゆえの多々ある選択肢のうちどれが効率的かを示す本。

Note

/* Fooがテンプレートを持たない場合 */
class Foo {
private:
  // コピーのコストを下げるために内容をインスタンスとして持つ。
  FooContent *_content;
public:
  void swap(Foo &other) {
    // シンボル検索範囲にstdを追加する。
    // NOTE: ひょっとしたらFooContentに特化したswap()があるかもしれないため、
    //       std::swap(...)のように決め打ちしない。
    using std::swap;
    swap(_content, other._content);
  }
};
namespace std {
  // Fooに特化したstd::swap()
  template<>
  void Swap<Foo>(Foo &a, Foo &b) {
    a.swap(b);
  }
}
/* Fooがテンプレートを持つ場合 */
template<typename T>
class Foo {
private:
  T *_content;
public:
  void swap(Foo<T> &other) {
    using std::swap;
    swap(_content, other._content);
  }
};
// Foo<T>に特化したswap()
// NOTE: stdは部分的に特化した関数を許容しないためstd外に定義する。
template<typename T>
void swap(Foo<T> &a, Foo<T> &b) {
  a.swap(b);
}
void f() {
  using std::swap;
  ...
  swap(foo1, foo2);
}
template<typename T> // typenameでもclassでも良い
class D : public A<T>::B { // typename不要
public:
  D(int a): A<T>::B(a) { // typename不要
    typename A<T>::C c; // typename必要
    typename T::E e; // typename必要
  }
};
template<typename T>
class A {
public:
  void f();
};

template<typename T>
class D : public A<T> {
public:
  using A<T>::f; // (2) ここでusingしておく。
  void g() {
    f(); // (1) 確かにfはAのメンバだがA<T>は未定なクラスなのでコンパイルエラー。
         // (2) usingしておけばOK。
    this->f(); // (3) OK。
    A<T>::f(); // (4) OK。
               //     ただし仮想関数の動的結合の観点で良くないらしい。
  }
};
#include <iostream>

template<unsigned n>
struct Factorial {
  enum { value = n * Factorial<n-1>::value };
};

template<>
struct Factorial<0> {
  enum { value = 1 };
};

int main() {
  std::cout << Factorial<20>::value << std::endl; // 2192834560
}

Impression

本書が発刊されたより後のC++を知っているため所々「古いなあ」と感じる。が、学びがないかと言えば当然そんなことはなく、上記の色々を学んだ。

本書はC++の罠の解説であって、あるいは悪く言えば小手先のテクニック解説であって、C++のパラダイムにおける設計のようなマクロな話の解説はない。つまり、マクロな話が分かる人がC++流の書き方を覚えるための本であろう。その点でも「中級者向け」という世間の評価は頷ける……いや、初心者に設計の話をするのも違うか。

戻る