怎么使用和规避模板函数指针的类型指定

本文探讨了在使用模板函数指针时遇到的问题,指出在指定函数指针类型时需要提前确定参数类型,这可能导致编译错误。为了解决这个问题,文章提出了使用仿函数作为解决方案,并提到可以通过宏封装进一步简化。文中还分享了一段项目代码,包含is_pointer_ex和is_container等特殊判断的实现,鼓励读者自行探索其工作原理。
摘要由CSDN通过智能技术生成

模板用的多的人都知道使用模板函数指针时,必须在指定函数指针时就对类型进行指定

template<typename Type>
void aaa (Type&&)
{

}

int main (int argc, char* argv[])
{
    std::function<void (int) > f = aaa<int>;
}

但指定函数指针的地方不是函数实际发生调用的地方,所以参数的引用类型对于指针的指定处来说是不必要的依赖,而且指定类型时会明确左右值,这在很多复杂情况下会直接导致显式类型模板函数指针编译不通过(因为入参有左值也有右值)

//这段代码只要不改成拷贝,无论怎么改左右值都无法通过

template<typename Type>
void aaa (Type&&) 
{

}

template<typename Func>
class B
{
    Func f;
public:
    B (Func f) : f (f) {}
    template<typename ...Args>
    auto invoke() (Args&& ...args)->decltype (f (std::forward<Args> (args)...))
    {
        return f (std::forward<Args> (args)...);
    }
};
template<typename Func>
auto make_B (Func&& f)->B<Func>
{
    return B<Func> (std::forward<Func> (f));
}

int main (int argc, char* argv[])
{
    auto f = make_B (aaa<int>);

    int i = 1;
    f.invoke(i);
    f.invoke(std::move (i));
}

 

也就是说需要有一个完成指定非明确类型的模板函数指针的方式,解决办法是仿函数。

class AAAImple
{
    template<typename Type>
    static void aaa (Type&&)
    {

    }
public:
    template<typename...Args>
    auto operator() (Args
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值