我想知道是否有办法在模板类中放置非模板函数。简单地说,我不想编译器为每种类型重复该函数,因为该函数只是在操作指针,因此没有类型。这可能吗?
所以如果你有这样的代码
template <typename T>
class CLASS{
};
那么其中的每个函数都将针对每种类型重复 T 我根本不希望这种情况发生
我想要一个对所有类型都是静态的函数,并且不会在内存中为每个单独的类型重复。
我想知道是否有办法在模板类中放置非模板函数。简单地说,我不想编译器为每种类型重复该函数,因为该函数只是在操作指针,因此没有类型。这可能吗?
所以如果你有这样的代码
template <typename T>
class CLASS{
};
那么其中的每个函数都将针对每种类型重复 T 我根本不希望这种情况发生
我想要一个对所有类型都是静态的函数,并且不会在内存中为每个单独的类型重复。
从基类继承函数
class BASE_CLASS {
public:
static void not_a_templated_function();
};
template <typename T>
class CLASS: public BASE_CLASS {
};
我假设你的问题是这样的:
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 对象的“胆量”进行相同的转发(如果有的话) .