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クラスを使う必要は無いはずです。