c++ - 为什么要使用静态函数模板?

标签 c++ templates static

我正在阅读 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 关键字指的是静态链接,即该函数仅在定义它的翻译单元中可见。

现在,作为在头文件中定义的函数,static 关键字的作用是编译器将为包含头文件的每个翻译单元中的函数生成代码(以及实际上使用该功能)。此外,该函数将被内联。

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

因此,有趣的问题可能是“为什么要使用 static 非模板函数”。

关于c++ - 为什么要使用静态函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29495678/

相关文章:

c++ - 使用指针时表达式必须具有类类型

c++ - 负NaN不是NaN吗?

c++ - 使用 Switch-case 语句拉取随机纸牌等级和花色以显示给用户

c++ - 非类型模板参数不是常量表达式

java - 不同语言中静态代码和有状态代码分离的差异

c++ - 用http get下载一张图片,只下载了一小部分

c++ - 是否可以编写一个同时接受右值和左值的模板函数

c++ - 模板参数无效(唯一指针)

dynamic - 什么是具有动态范围和静态类型的编程语言?

C++静态成员函数错误C2556重载函数仅返回类型不同