【问题标题】:Template argument deduction of return type返回类型的模板参数推导
【发布时间】:2021-03-02 01:20:08
【问题描述】:

这里的返回类型是如何推导出来的? 换句话说,如何根据函数指针的返回类型实例化正确的函数。

template<typename From, typename To>
To Convert(const From& f) 
{
    std::cout << sizeof(From) << " " << sizeof(To) << std::endl;    
    return To(f);
}



int main()
{
    float (*p)(const double &e) = Convert;
    p(20.2);

}

打印出来

8 4

【问题讨论】:

  • 您将Convert 分配给一个函数指针p,其签名明确为float (*)(const double &amp;),因此From=doubleTo=float 只是从该签名中推导出来的,因为它们是唯一的推导出可以满足赋值的模板值。

标签: c++ templates template-argument-deduction


【解决方案1】:

在函数调用中确实不能推导出返回类型,即使有可以使用的上下文:

template<class T> T get();
struct X {} x=get();  // error: cannot deduce T

除了(引用)cv X 之外没有其他类型可以在这里工作,但你只是不认为它正是变量的初始化器。

但是,当函数在特定类型为 "obviously" expected 的上下文中命名时,可以推断返回类型,如问题中,以及在使用转换函数模板时(因为没有别的可以推断)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多