模板类中的非模板函数

时间:2014-12-05 22:35:48

标签: c++ function template-classes

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

所以如果你有这样的代码

template <typename T>
class CLASS{

};

然后对每种类型T重复其中的每个函数 我根本不希望这种情况发生

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

2 个答案:

答案 0 :(得分:1)

从基类继承函数

class BASE_CLASS {
public:
    static void not_a_templated_function();
};

template <typename T>
class CLASS: public BASE_CLASS {

};

答案 1 :(得分:1)

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

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. */
  };
};

你想要定义&#34; bar&#34;以这样一种方式,只有一个条形函数,而不是每个实例化一个条形函数,即你不希望Foo<int>::bar成为与{Foo<double>::bar不同的函数。 1}}。

这是不可能的,因为&#34; bar&#34; function是每个实例化的类模板的成员。

你可以而且应该做的是定义一个帮助(免费)功能,它具有所有T&#34;相同的所有T&#34;代码在里面。像这样:

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函数会被编译器内联,而真正剩下的就是扩展&#34; guts&#34; Foo对象(如果有的话)作为辅助函数的参数(可以根据需要使用或不使用外部链接实现)。

另一个选择是从非模板基类继承,但我个人不喜欢使用继承来处理那种东西,你仍然需要转移&#34; guts&# 34; Foo对象(如果有的话)。