内联 Lambda 变量 vs 内联函数 vs 具有自动类型推导的内联模板函数

Inline Lambda variable vs Inline function vs Inline template function with automatic type deduction

假设我想声明一个内联函数,它将接受任意类型的参数。 我觉得可以通过以下方式实现。

//////
inline auto const myfunc = [&](const auto& val){return something(val);};
//////
inline auto myfunc(const auto& val)
{
    return something(val);
}
//////
template<class T>
inline T myfunc(const T& val)
{
    return something(val);    
}

所以我有几个问题。

  1. 我的定义有没有错误,是否支持这些定义?
  2. 这些定义中的任何一个与另一个相比有什么优势吗?如果有,优势是什么?
  3. 这些定义中哪一个在代码质量方面更好?

提前致谢。

它们 3 的定义略有不同。因此,对 2 的回答是:选择一个做你想做的。 1) 我会留给你,因为你可以很容易地试用它们,看看它们是否编译。 3) 不是那么相关,因为在它们之间进行选择是您实际需要的问题,而不是风格。

inline auto const myfunc = [&](const auto& val){return something(val);};

lambda myfunc 是一些带有模板 operator() 的未命名类型。 myfunc 本身没有模板化。您可以将 myfunc 传递给其他函数,因为它是一个对象。你不能用其他两个轻松做到这一点。

两者的区别

inline auto myfunc(const auto& val)
{
    return something(val);
}

template<class T>
inline T myfunc(const T& val)
{
    return something(val);    
}

是return类型。对于第二个,return 类型是 TT 要么从参数中推导出来,要么您明确指定它,然后它可以与传递的参数不同,只要参数可以转换为 const T&。因此,第一个更类似于 lambda(更准确地说,与其 operator()),因为 return 类型是从 something(val) 推导出来的,尽管 lambda 还通过 & 捕获.你不能用函数轻易做到这一点。