为什么要使用静态函数模板

Why use static function template?

本文关键字:静态 函数模板 为什么      更新时间:2023-10-16

我正在阅读Alex Graves的rnnlib。在他的代码中,有许多静态函数模板不是类成员方法,而是定义为static,而有些则不是。(见下文)

Helpers.hpp:的一些代码片断

...
// static
template <class R> static void sort(R& r)  
{
    sort(boost::begin(r), boost::end(r));
}
// static
template <class R> static void reverse_sort(R& r) 
{
    sort(boost::rbegin(r), boost::rend(r));
}
// non static
template <class R> pair<typename range_value<R>::type, typename range_value<R>::type> minmax(const R& r) 
{
    pair<typename range_const_iterator<R>::type, typename range_const_iterator<R>::type> p = minmax_element(boost::begin(r), boost::end(r));
    return make_pair(*p.first, *p.second); 
}
// static
template <class R> static void bound_range (R& r, const typename boost::range_value<R>::type& minVal, const typename boost::range_value<R>::type& maxVal)
{
    for (typename range_iterator<R>::type it = boost::begin(r); it != boost::end(r); ++it) 
    {
        *it = bound(*it, minVal, maxVal);
    }
}
...

为什么这些全局函数模板中的一些被定义为静态,而另一些则不是?

在该上下文中,static关键字指静态链接,即该函数仅在定义它的翻译单元中可见。

现在,由于函数是在头文件中定义的,static关键字的效果是编译器将在包括头文件的每个翻译单元中为该函数生成代码(并且实际使用该函数)。此外,该函数将被内联。

对于模板函数,我认为使用staticinline或不使用关键字都会产生相同的结果;事实上,在所有情况下,函数都是内联的,不会引发多重定义错误。

因此,有趣的问题可能是"为什么在非模板函数上使用static"。

使用静态函数是指当我们的代码编译时,将执行静态代码。所以所有静态函数的链接都是在编译时完成的。