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

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

所以如果你有这样的代码

template <typename T>
class CLASS{

};

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

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

【问题讨论】:

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

标签: c++ function template-classes


【解决方案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 对象的“胆量”进行相同的转发(如果有的话)。

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2011-06-07
      • 2012-03-02
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多