-1

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

所以如果你有这样的代码

template <typename T>
class CLASS{

};

那么其中的每个函数都将针对每种类型重复 T 我根本不希望这种情况发生

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

4

2 回答 2

1

从基类继承函数

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

template <typename T>
class CLASS: public BASE_CLASS {

};
于 2014-12-05T22:55:35.200 回答
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. */
  };
};

并且您希望以这样一种方式定义“bar”,即只有一个 bar 函数,而不是一个用于“Foo”的每个实例化的函数,即,您不想Foo<int>::bar成为与Foo<double>::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 对象的“胆量”进行相同的转发(如果有的话) .

于 2014-12-05T22:57:34.840 回答