@dag が言及したこととは別に、パラメーター名のない関数定義は、テンプレートの特殊化で使用されます。あなたが投稿した例にはテンプレートがないと言っていたことは知っていますが、完全を期すために、このユースケースを投稿したいと思います:
コンテナーのerase
関数を定義したとします。std
ただしerase_helper
、コンテナーの種類に基づいて実際の作業を行うには、さまざまな方法が必要です。一般的で受け入れられる方法は、 を使用することtraits
です。
// Tags for containers
struct vector_tag {};
struct map_tag {};
// Trait class
template <typename C> struct container_traits;
// Specialization of trait class
template <typename T, typename A>
struct container_traits<std::vector<T, A>>
{
typedef vector_tag category;
};
template <typename K, typename V, typename C, typename A>
struct container_traits<std::map<K, V, C, A>>
{
typedef map_tag category;
};
// Helper function
template <typename Container, typename X>
void erase_helper(Container& c, const X& x, vector_tag) // <-- no param name
{
// Erase element from vector
}
template <typename Container, typename X>
void erase_helper(Container& c, const X& x, map_tag) // <-- no param name
{
// Erase element from map
}
// Function interface
template <typename Container, typename X>
void erase(Container& c, const X& x)
{
erase_helper(c, x, typename container_traits<Container>::category());
}
ここでわかるようにerase_helper
、名前のない 3 番目のパラメーターがあります。パラメーターの型は、テンプレートのインスタンス化段階で正しい関数を選択するようにコンパイラに指示します。