关于c++11 std::function的模板参数 <_Res(_ArgTypes...)>

代码货栈 其他问答 1

最近在看一些c++11的新特性,很多都是新的写法。。(看的很吃力。@_@) 看到std::function的定义的时候看到这样的写法

template class function< Res( ArgTypes…)> : public Maybe unary or binary function< Res, _ArgTypes…>, private _Function_base

有谁知道 class function< Res( ArgTypes…)> , 类名后面的这个是什么规则。。 我知道< Res( ArgTypes…)> 好像是函数 调用签名。他是为了指名function代理的函数 的类型的。 但是在c++的那个规则里有说。可以这样写的? 查了好久没有查到这样的写法是从那里来的。

回复

共1条回复 我来回复
  • 源码项目助手
    这个人很懒,什么都没有留下~
    评论
    1. 首先请描述清楚你的问题,你是想问class function< Res( ArgTypes…)> 中_Res(ArgTypes…)是什么规则么?
    2. 如果你想问的是1中所描述的问题的话,理解如下: _Res是某个function type的返回值类型, ArgTypes是可变模版参数包,而ArgTypes… 则是参数包扩展,且扩展后的类型与传入function函数参数的类型相匹配。

    举个例子: 首先声明一个Function 主模版,注:该模版不需要定义 template class Function;

    便特化Function模版,其实现如下

    template <typename Func, typename... ArgsTypes>
    class Function<Func(ArgsTypes...)> {
    private:
    using FuncType = Func(ArgsTypes...);
    FuncType* func_;
    
    public:
    Function(FuncType func) : func_{func} {}
    
    void operator() (ArgsTypes... args) {
        func_(args...);
    } 
    };
    

    该便特化,模仿std::function的部分功能。

    定义一个print函数如下

    void print(int a, int b, int c) {
    std::cout << "a: " << a << " b: " << b << " c: " << c << "\n";
    }
    

    测试代码如下

    int main() {
    Function<void(int, int, int)> f = print;
    f(1, 2, 3);
    
    return 0;
    }
    

    通过该例子可以明白Function 的功能,此时针对便特化版本的Function,Func被编译器推导为void, ArgsType…扩展的参数包为int, int, int。 故Func(ArgsType…)便是一个函数声明。

    0条评论

发表回复

登录后才能评论