gpt4 book ai didi

c++ - 在模板函数和自动类型推导之间选择

转载 作者:太空狗 更新时间:2023-10-29 20:03:19 24 4
gpt4 key购买 nike

我有一个关于模板函数与函数的自动类型推导的一般性问题。

多年来,我们已经能够编写模板函数:

template <class T> T add(T a,T b){
return a+b;
}

有一个使用 auto 进行函数参数推导的 TS

auto add(auto a,auto b){
return a+b;
}

我虽然使用 auto,但无法获得实际类型,例如使用静态成员,但这工作得很好:

#include <iostream>

struct foo
{
static void bar(){std::cout<<"bar"<<std::endl;}
static int i ;
};
int foo::i{0};
void t(auto f){
decltype(f)::bar();
std::cout<< decltype(f)::i<<std::endl;
}
int main(int argc, char *argv[])
{
t(foo());
return 0;
}

那么有什么理由选择一个而不是另一个吗?

最佳答案

此特定代码的明显原因是它们实际上根本不具有相同的语义。

特别是,如果您传递不同类型的参数,使用 auto 的版本将为每个参数独立推导一个类型,然后基于这些推导结果的类型。

相反,对于模板版本,您只指定了一种类型,因此参数必须是同一类型(并且结果将是相同的)。

因此,为了使代码更接近等效,您确实需要将模板编写得更像:

template <class T, class U> 
auto add(T a, U b) -> decltype(a+b) {
return a+b;
}

这显然也是可能的,但为支持使用 auto 的论点增加了更多的力量。

关于c++ - 在模板函数和自动类型推导之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com