转载:泛化之美--C++11可变模版参数的妙用 - qicosmos(江南) - 博客园 (cnblogs.com)
重点:
1.template<class T>和template<typenameT>
typename 和class 两者都可以用,但有时候会有差别,尽量用typename,因为用typename包括所有的问题。
每个用到T的函数或者类前面都必须加一个template<typenameT>,而不是加一个就一劳永逸。
2.逗号表达式:
这个表达式会按顺序执行:b会先赋值给a,接着括号中的逗号表达式返回c的值,因此d将等于c。
3.可变长数组
通过扩展包来实现可变数组。很不错的用法。
方法一:
一个参数包展开的函数和一个递归终止函数,递归终止函数正是用来终止递归的。
方法二:采用完美转发、右值、
C#委托方法实现
#include <initializer_list>
#include <type_traits>
using namespace std;
//T是类名,R是函数返回的类型,Args是多个参数
//T::*f 函数指针,f是函数名
template<typename T,typename R,typename... Args>
class Delegate
{
public:
Delegate(T* t, R(T::* f)(Args...)) :m_t(t), m_f(f) {}
R operator()(Args&&... args)
{
return (m_t->*m_f)(std::forward<Args>(args)...);
}
private:
T* m_t;
R (T::* m_f)(Args...);
};
template<typename T, typename R, typename... Args>
Delegate<T, R, Args...> CreateDelegate(T* t,R (T::*f)(Args...))
{
return Delegate<T,R,Args...>(t,f);
}
struct A
{
void fun(int i) { cout << i << endl; };
void fun1(int i,double j) { cout << i+j << endl; };
};
int main()
{
A a;
auto d = CreateDelegate(&a, &A::fun);
d(10);
auto t = CreateDelegate(&a, &A::fun1);
t(10,20);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)