内联 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);
}
所以我有几个问题。
- 我的定义有没有错误,是否支持这些定义?
- 这些定义中的任何一个与另一个相比有什么优势吗?如果有,优势是什么?
- 这些定义中哪一个在代码质量方面更好?
提前致谢。
它们 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 类型是 T
。 T
要么从参数中推导出来,要么您明确指定它,然后它可以与传递的参数不同,只要参数可以转换为 const T&
。因此,第一个更类似于 lambda(更准确地说,与其 operator()
),因为 return 类型是从 something(val)
推导出来的,尽管 lambda 还通过 &
捕获.你不能用函数轻易做到这一点。
假设我想声明一个内联函数,它将接受任意类型的参数。 我觉得可以通过以下方式实现。
//////
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);
}
所以我有几个问题。
- 我的定义有没有错误,是否支持这些定义?
- 这些定义中的任何一个与另一个相比有什么优势吗?如果有,优势是什么?
- 这些定义中哪一个在代码质量方面更好?
提前致谢。
它们 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 类型是 T
。 T
要么从参数中推导出来,要么您明确指定它,然后它可以与传递的参数不同,只要参数可以转换为 const T&
。因此,第一个更类似于 lambda(更准确地说,与其 operator()
),因为 return 类型是从 something(val)
推导出来的,尽管 lambda 还通过 &
捕获.你不能用函数轻易做到这一点。