重载可以区分非静态成员方法和其他函数的模板函数
Overloading a template function which can differentiate between non-static member method and other functions
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
(来自容器)是而不是调用函子所需的,但是您可以将其作为参数传递给它。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 保留对其他类的成员函数的引用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 如何在其他文件中使用函数
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 泛型枚举和其他类型的重载模板函数
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 将基类的成员函数重载到其他派生类C++
- 如何在其他类中使用参数化构造函数制作类的对象?
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 没有头文件如何使用c ++调用其他模块中的函数?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- 如何制作 cmakelists.txt编译使用在其他地方声明和实现的函数和类的 CPP
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 通过向构造函数其他对象引用页面来创建对象