ぷろみん

プログラミング的な内容を扱ってます

namespaceとUtilityクラス(staticメンバ関数)

モチベーション

namespaceとUtilityクラスでは同じような機能を提供できる。どちらを使うべきか。

namespace

namespace Foo {
    struct Object {};
    void Function(Object) {}
}

int main() {
    Foo::Object foo;
    // ADLにより解決されるので簡易にかける
    Function(foo);
}

Utilityクラス

struct Foo {
    struct Object {};
    // static関数にする必要がある
    static void Function(Object) {}
};

int main() {
    Foo::Object foo;
    // Foo::を付けなかった場合コンパイルエラー
    Foo::Function(foo);
}

ADL(Argument Dependent name Lookup)

引数の型によって呼び出す関数を選択する機能です。
namespaceの項目の様に関連付けられた名前空間は省略できます。

どちらを使うべきか

やはりnamespaceを使うべきでしょう。 Utilityクラスはstaticが明らかに無理をしている感じだし、このままだと無駄なオブジェクトが生成できてしまいます。

ADLを避ける場合でもnamespaceのネストを深くすれば解決できる事が知られているのでUtilityクラスを使う必要は無いはずです。