emplace_back

C++11から,いくつかのコンテナ(vectorとかdequeとか)に emplace_back というメンバ関数が増えていた.

class Hoge{
    int a;
    double b;
    std::string c;
    public:
        Hoge(int a, double b, const std::string& c)
            :a(a), b(b), c(c){}
};

というクラスがあったとして,これのインスタンスをvectorなどのコンテナに入れるとする.

これまでは,

std::vector<Hoge> x;
x.push_back(Hoge(a1,b1,c1))
x.push_back(Hoge(a2,b2,c2))
x.push_back(Hoge(a3,b3,c3))

という感じで書いていた.
これは,一時的にインスタンスを生成してvectorの要素にコピーしている.

emplace_backを使うと,

std::vector<Hoge> x;
x.emplace_back(a1,b1,c1)
x.emplace_back(a2,b2,c2)
x.emplace_back(a3,b3,c3)

という風に書けて,vectorの要素に直接インスタンスを生成できる(?).

面白いのが,このemplace_backの引数の型や個数はコンテナに入れるクラスのコンストラクタによって決まるので,
どんな型の引数を何個受け取るのかはvectorやdequeの実装時には分からない.

これを実現しているのが可変長引数テンプレート(variadic templates)というテクニック.
C言語でもある,可変長引数のテンプレート版…かな.
こちらも再帰をうまく使って型と引数を取り出すっぽい.
これはまだ要勉強.