c ++ 11 std :: ref是如何工作的?

时间:2017-04-22 12:19:14

标签: c++ c++11 std

我的任务是实现自己的std :: ref函数。我知道有一个reference_wrapper仿函数,它有助于std :: ref。但是我怎么能实现这些函数/类。我想到以下几点:

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()时,我们需要知道它的参数,因为我们想将它们传递给functor的operator()(我用'parameter'签名)。 std :: ref如何在没有任何模板参数的情况下执行此操作?

1 个答案:

答案 0 :(得分:2)

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

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类型的两个参数; double将转换为int,就像对于需要两个int值的非模板函数一样。