模板类中的非模板函数[关闭]

Posted

技术标签:

【中文标题】模板类中的非模板函数[关闭]【英文标题】:non template function in a template class [closed] 【发布时间】:2014-12-05 22:35:48 【问题描述】:

我想知道是否有办法在模板类中放置非模板函数。 简单地说,我不想编译器为每种类型重复该函数,因为该函数只是在操作指针,因此没有类型。这可能吗?

所以如果你有这样的代码

template <typename T>
class CLASS

;

那么里面的每个函数将针对每种类型 T 重复 我只是不希望这种情况发生

我想要一个对所有类型都是静态的函数,并且不会在内存中为每个单独的类型重复。

【问题讨论】:

你试过了吗? 模板类的所有成员函数都是非模板的,除非它们本身用template 声明。但这可能不是您要问的。 如果你有类似这个模板的代码 class Object 那么里面的每个函数都会为每个类的类型重复 如果您发布代码并准确告诉我们您的问题是什么会更好。 【参考方案1】:

从基类继承函数

class BASE_CLASS 
public:
    static void not_a_templated_function();
;

template <typename T>
class CLASS: public BASE_CLASS 

;

【讨论】:

【参考方案2】:

我认为你的问题是这样的:

template <typename T>
struct Foo 
  //..
  void bar() 
    /* most or all code here is the same for all T, 
       and uses nothing that depends on T. */
  ;
;

并且您希望以这样一种方式定义“bar”,即只有一个 bar 函数,而不是每个“Foo”实例化的函数,即,您不希望 Foo&lt;int&gt;::bar 成为不同的函数来自Foo&lt;double&gt;::bar

这是无法做到的,因为“bar”函数是类模板的成员,因此也是其每个实例的成员。

您可以而且应该做的是定义一个辅助(免费)函数,其中包含所有“所有 T 相同”代码。像这样的:

namespace 
  void Foo_bar_helper(/*..*/) 
    /* common code goes here. */
  ;
;

template <typename T>
struct Foo 
  //..
  void bar() 
    Foo_bar_helper(/* pass the "guts" of Foo<T> here. */);
  ;
;

通常,bar 函数将被编译器内联,真正剩下的只是扩展 Foo 对象(如果有的话)的“胆量”作为辅助函数的参数(您可以使用或不使用外部函数来实现)链接,如你所愿)。

另一种选择是从非模板基类继承,但我个人不喜欢对这类东西使用继承,而且您仍然需要对 Foo 对象的“胆量”进行相同的转发(如果有的话)。

【讨论】:

以上是关于模板类中的非模板函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

类中的模板函数

C++模板类中的成员函数以及模板函数在类外定义的方式

在派生类中使用模板基类模板构造函数

在 C++ 中的多个类中使用模板类

类模板模板类函数模板模板函数

模板类中的构造函数继承 (C++11)