重载可以区分非静态成员方法和其他函数的模板函数

Overloading a template function which can differentiate between non-static member method and other functions

本文关键字:函数 其他 成员方法 静态 重载      更新时间:2023-10-16
struct A // some class
{
  void method(); // non-static member method
  static void function(); // static member method
};
void function(); // global function
vector<A> vi; // any such `std` like container

我想有一个函数(比如Iterate()),可以用下面的方式调用:

Iterate(vi, &A::method);  // (1)
Iterate(vi, &A::function); // (2a)
Iterate(vi, &function); // (2b)

(2a)和(2b)完全相同。

现在(1)和(2)的Iterate()原型如下:

template<typename Container, typename Method>
void Iterate (Container &container, Method method); // for (1)
template<typename Container, typename Function>
void Iterate (Container &container, Function function); // for (2a), (2b)

很自然地两者完全相同,这将导致编译错误。是否有一种方法可以重载/专门化Iterate()在c++ 03中,这将允许两个函数共存?

您可以使一个函数比另一个更具体:

template<typename Container, typename Functor>
void Iterate (Container &container, Functor fun); 
template<typename Container, typename R, typename ..Args>
void Iterate (Container &container, R (Container::value_type::*fun)(Args...));

第一个模板适用于普通函数、函数对象和静态成员函数,而第二个模板只适用于非静态成员函数。

在c++ 03中,您可以通过编写重载来模拟可变变量模板,如下所示:

template<typename Container, typename R>
void Iterate (Container &container, R (Container::value_type::*fun)());
template<typename Container, typename R, typename Arg>
void Iterate (Container &container, R (Container::value_type::*fun)(Arg));
template<typename Container, typename R, typename Arg1, typename Arg2>
void Iterate (Container &container, R (Container::value_type::*fun)(Arg1, Arg2));
//add more overloads to handle member functions 
//that take 3 or more arguments

当然,如果你必须以不同的方式实现它们。例如,调用成员函数的语法将是(obj.*fun)(a1,a2,a3);,而函数调用语法仅为fun(a1,a2,a2)。我不知道你会给函数传递什么参数(成员或函子)。我假设这不是真正的代码,你只是想探索语法。

重要的一点是,obj(来自容器)是而不是调用函子所需的,但是您可以将其作为参数传递给它。
相关文章: