我想知道是否有办法在模板类中放置非模板函数。 简单地说我不想编译器为每种类型重复该函数,因为该函数只是操纵指针因此没有类型。这可能吗?
所以如果你有这样的代码
template <typename T>
class CLASS{
};
然后对每种类型T重复其中的每个函数 我根本不希望这种情况发生
我想要一个对所有类型都是静态的函数,并且在内存中不会为每个类型重复。
答案 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对象(如果有的话)。