How does c++11 std::ref work?

How does c++11 std::ref work?

本文关键字:ref work std does c++11 How      更新时间:2023-10-16

我的任务是实现我自己的std :: ref函数。我知道有一个Reference_wrapper functor,它有助于STD ::参考。但是我该如何实施这些功能/类。我考虑以下内容:

template <class T>
struct myreference_wrapper{
    T& functor;
    myreference_wrapper(T& t):functor(t){}
    void operator()('parameter') {
        functor('parameter');
    };
};
template<class T>
myreference_wrapper<T> myref(T& t){
   myreference_wrapper<T> functor(t);
   return functor;
}

当我们调用MyRef时,我们无法使用模板参数,因为STD :: REF不使用模板参数。但是,当我们调用operator((时,我们需要知道其参数,因为我们要将它们传递给函数运算符(((我用'parameter'签名(。STD :: ref无需任何模板参数吗?

模板函数可以从调用函数的类型中推导模板参数。例如:

template <class T> T min(T a, T b) {
    return a < b ? a : b;
}

当您调用此功能时,您不需要指定模板参数:

int x = min(1, 2);

编译器查看函数参数的类型,发现它们既是int,又结论一下它需要调用min<int>

呼叫myref模板功能的同一件事:

int i;
myref(i);

再次,编译器查看函数参数的类型,看到它是int,并得出结论,它需要调用myref<int>

顺便说一句,上面的min功能可能更复杂。min(1, 2.0)不会编译,因为两个函数参数类型是不同的。一个是int,一个是double,因此没有与两者完全匹配的T。这里有几种可能的解决方案。一种是重写模板函数,以便具有两个模板类型参数,而不是一个:template <class T0, class T1> ??? min(T0, T1)。这导致了设计问题:正确的回报类型是什么?另一个解决方案是将调用代码更改以传递相同类型的参数。另一个是明确给出模板参数类型:min<int>(1, 2.0)。该代码说要调用min<int>,该代码采用了int类型的两个参数;双重将转换为 int,就像对占两个int值的非模板函数一样。