【问题标题】:Why use static function template?为什么要使用静态函数模板?
【发布时间】:2015-04-07 15:46:41
【问题描述】:

我正在阅读 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);
    }
}
...

为什么有些全局函数模板定义为静态,而有些则

【问题讨论】:

  • 单一定义规则?
  • 见:stackoverflow.com/questions/8406800/… PS。我认为您的问题与模板无关,而与静态修饰符无关...
  • @KerrekSB:这些函数已经内联,所以不会破坏 ODR。

标签: c++ templates static


【解决方案1】:

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

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

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

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

【讨论】:

  • 非静态函数minmax呢?有什么特别的吗?
  • @nn0p 正如我所说,结果几乎相同。 “特殊”在于,如果 minmax 是一个非模板函数,您将不得不在签名中添加“静态”或“内联”。
【解决方案2】:

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

【讨论】:

  • 您的回答对我来说似乎是错误的和荒谬的。 1) 静态函数在编译时不会被评估。在编译期间只计算常量表达式和constexpr 函数。 2) 所有函数都在编译时链接(编译二进制文件时)。你可能错过了静态/动态链接这个术语与静态/动态绑定(这个是关于虚函数的)吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多