以下のコードでは、foo
誰でもアクセスできる関数である必要がありますが、アクセスできfoo_helper
ないため、匿名の名前空間に配置しました。明らかに、この例ではインクルード ガードとインクルードを除外していますが、それらは存在します。
foo.h
:
namespace
{
void foo_helper() {}
template <typename T, typename... Tail>
void foo_helper(T head, Tail... tail)
{
bar(head);
foo_helper(tail...);
}
}
void foo();
template <typename... Args>
void foo(Args... args)
{
before();
foo_helper(args...);
after();
}
foo.cpp
:
void foo() {}
問題は、foo_helper
の可変個引数テンプレートが機能するためには、引数のない初期バージョンが必要なことです。ただし、これにより、テンプレート以外の関数をヘッダー ファイルとして定義する必要があり、このファイルを複数のソース ファイルに含めると壊れてしまいます。の定義をfoo_helper
ソース ファイルに移動できません。これは、匿名の名前空間にあり、アクセス可能であることが想定されていないためです。
この問題を解決する方法はありますか?