【问题标题】:How does c++11 std::ref work?c++11 std::ref 是如何工作的?
【发布时间】:2017-04-22 12:19:14
【问题描述】:

我的任务是实现我自己的 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() 时,我们需要知道它的参数,因为我们想将它们传递给仿函数的 operator()(我用 'parameter' 签名)。 std::ref 在没有任何模板参数的情况下如何做到这一点?

【问题讨论】:

  • 您可以尝试将myreference_wrapper 专门用于Callable 类型。
  • std::ref什么时候不用模板参数了?
  • 为什么要重新发明轮子而不使用std::ref
  • 嗯,检查 stl 中的某些内容是如何实现的最好方法是……阅读一些实现源。例如,在 Visual Studio 中写入 std::ref 并按 Alt + F12。
  • 这是检查的好方法,@Caribou,但不是理解的好方法。 C++ 标准库实现文件通常极其复杂且难以理解。要求对 Stack Overflow 进行更清晰的解释并非没有道理。虽然,首先检查实现可能会发现,事实上,std::ref 确实 使用模板参数。 :-)

标签: c++ c++11 std


【解决方案1】:

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

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

当你调用这个函数时你不需要指定模板参数:

int x = min(1, 2);

编译器查看函数参数的类型,发现它们都是int,并得出结论它需要调用min&lt;int&gt;

调用myref 模板函数也是如此:

int i;
myref(i);

再次,编译器查看函数参数的类型,发现它是int,并得出结论它需要调用myref&lt;int&gt;

顺便说一句,上面的min 函数使用起来可能有点复杂。 min(1, 2.0) 不会编译,因为两个函数参数类型不同;一个是int,一个是double,所以没有两个完全匹配的T。这里有几种可能的解决方案。一种是重写模板函数,使其具有两个模板类型参数,而不是一个:template &lt;class T0, class T1&gt; ??? min(T0, T1)。这导致了一个设计问题:正确的返回类型是什么?另一种解决方案是更改调用代码以传递相同类型的参数。还有一个是明确给出模板参数类型:min&lt;int&gt;(1, 2.0)。这段代码说要调用min&lt;int&gt;,它接受两个int 类型的参数; double 将被转换为 int,就像它对于接受两个 int 值的非模板函数一样。

【讨论】:

  • 我认为 OP 的问题是关于 reference_wrapperCallable 对象,它提供了一个 operator() 运算符,并且 OP 询问他如何检索这个 operator() 的参数(和返回类型)而std::ref 不使用这些。
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 2011-03-11
  • 1970-01-01
  • 2021-09-23
  • 2013-06-15
  • 2012-12-15
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多