除了@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
第三个参数没有名字。参数类型告诉编译器在模板实例化阶段选择正确的函数。