C++ 依赖类型 函数指针

依赖类型

依赖类型的概念:

依赖类型是指在模板编程中,类型依赖于模板参数的一种特殊类型, 它是通过使用模板参数来定义的, 而不是显示地指定类型。由于模板参数可以是任何类型,编译器在实例化模板时无法确定依赖类型的具体定义和属性。当使用依赖类型的时候需要使用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
{
}

类模板函数案例:

template<typename T = int, int N = 5>
class Array
{
    //
}

Array<> arr1; // 使用默认模板参数int 和 5
Array<double, 3> // 使用double 和 3作为参数

函数模板默认参数

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值