C++中函数模板(function template) 的 推进(forward) 问题
当前位置:以往代写 > C/C++ 教程 >C++中函数模板(function template) 的 推进(forward) 问题
2019-06-13

C++中函数模板(function template) 的 推进(forward) 问题

C++中函数模板(function template) 的 推进(forward) 问题

函数模板在挪用函数的时候, 由于实参(argument)转换形参(parameter)的时候, 会产生改变, 导致无法保存原实参的信息, 即推进(forward)问题;

主要包罗: 引用和右值;引用, 即因为模板参数非引用, 导致复制操纵, 无法提供引用范例;右值, 即因为模板参数只能转换为左值, 无法提供右值;

办理要领:

引用: 利用右值参数(T&& t), 可以担保通报引用不产生改变;

右值:利用右值参数, 再利用forward()函数(#include<utility>), 可以把实参转换为初始范例, 左值或右值;

详细拜见代码注释, 及输出.

代码如下:

/* 
 * cppprimer.cpp 
 * 
 *  Created on: 2013.11.28 
 *      Author: Caroline 
 */
      
#include <iostream>  
#include <utility>  
      
void f (int v1, int &v2)  
{  
    std::cout << v1 << " " << ++v2 << std::endl;  
}  
      
void g (int &&i, int &j) //i为右值  
{  
    std::cout << i << " " << j << std::endl;  
}  
      
template <typename F, typename T1, typename T2>  
void flip1 (F f, T1 t1, T2 t2)  
{  
    f(t2, t1); //反序  
}  
      
template <typename F, typename T1, typename T2>  
void flip2 (F f, T1&& t1, T2&& t2) //右值通报, 担保引用性  
{  
    f(t2, t1); //反序  
}  
      
template <typename F, typename T1, typename T2>  
void flip3 (F f, T1&& t1, T2&& t2) //右值通报, 担保引用性  
{  
    f(std::forward<T2>(t2), std::forward<T1>(t1)); //反序  
}  
      
      
int main (void)  
{  
    int i(10), j(10);  
    f (42, i); //i通报引用产生改变  
    flip1 (f, j, 42); //j通报在flip1通报时是复制, 不产生改变  
      
    std::cout << "flip 1 : i = " << i << std::endl;  
    std::cout << "flip 1 : j = " << j << std::endl;  
      
    flip2 (f, j, 42); //j通报在flip1通报时是复制, 不产生改变  
    std::cout << "flip2 : j = " << j << std::endl;  
      
    g (42, i); //可以通报  
    //不能通报, 因为j在通报时酿成左值引用, 无法赋值右值  
    //cannot bind 'int' lvalue to 'int&&'  
    //flip1 (g, j, 42);  
      
    flip3 (g, j, 42); //forward函数担保通报所有信息  
      
    return 0;  
}

输出:

42 11  
42 11  
flip 1 : i = 11  
flip 1 : j = 10  
42 11  
flip2 : j = 11  
42 11  
42 11

作者:csdn博客 Spike_King

    关键字:

在线提交作业