依赖类型
依赖类型的概念:
依赖类型是指在模板编程中,类型依赖于模板参数的一种特殊类型, 它是通过使用模板参数来定义的, 而不是显示地指定类型。由于模板参数可以是任何类型,编译器在实例化模板时无法确定依赖类型的具体定义和属性。当使用依赖类型的时候需要使用typename关键字来告诉编译器该名称是一个类型。这是因为编译器默认将依赖名称解析为一个静态成员或静态成员函数。而不是一个类型。
案例
template<typename T>
class Num
{
public:
using pf = T*;
pf get_pf();
};
template<typename T>
typename Num<T>::pf Num<T>::get_pf() // 如果缺少了typename会报错C4346, pf依赖名称不是类型
{
return Num<T>::pf;
}
这个示例,演示了如何使用依赖类型,在这个例子中使用typename告诉编译器Num<T>::pf是一个类型。
函数指针
将函数指针作为参数传递
typedef int(*func_pf)(int,int); // 定义一个函数指针类型
int add(int a, int b)
{
return a + b;
}
int test_func(int a, int b, func_pf p)
{
// 通过函数指针调用函数
return p(a, b);
}
函数模板趣味用法举例
template<typename T, typename F>
void test_func(const T& a, const T& b, F pf)
{
cout << pf(a, b) << endl;
}
现在假设有如下类
class Func
{
public:
Func() { cout << "调用构造函数" << endl; }
Func(const Func& f) { cout << "调用复制构造函数" << endl; }
int operator()(int a, int b)
{
return a + b;
}
};
当进行如下调用
Func f1;
test_func(4, 5, f1);
此调用会导致使用复制构造函数,原因是,当将f1传递的时候函数模板会推断出,F的类型为类对象,所以传递对象时,会生成临时构造函数,导致复制构造函数的生成。
test_func(2, 4, Func());
这种传递则不会调用复制构造函数。
默认模板参数
类默认模板参数定义格式
template<typename T = default_type>
class ClassName
{
}
类模板函数案例:文章来源:https://www.toymoban.com/news/detail-623509.html
template<typename T = int, int N = 5>
class Array
{
//
}
Array<> arr1; // 使用默认模板参数int 和 5
Array<double, 3> // 使用double 和 3作为参数
函数模板默认参数文章来源地址https://www.toymoban.com/news/detail-623509.html
template<typename T, typename F = obj(代表一个对象)>
void testfunc<const T& a, const T& b, F function = F())
or
template<typename T, typename F = pf>
void testfunc<const T& a, const T& b, F function = func)
到了这里,关于C++ 依赖类型 函数指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!