模板类中的非模板函数[关闭]
Posted
技术标签:
【中文标题】模板类中的非模板函数[关闭]【英文标题】:non template function in a template class [closed] 【发布时间】:2014-12-05 22:35:48 【问题描述】:我想知道是否有办法在模板类中放置非模板函数。 简单地说,我不想编译器为每种类型重复该函数,因为该函数只是在操作指针,因此没有类型。这可能吗?
所以如果你有这样的代码
template <typename T>
class CLASS
;
那么里面的每个函数将针对每种类型 T 重复 我只是不希望这种情况发生
我想要一个对所有类型都是静态的函数,并且不会在内存中为每个单独的类型重复。
【问题讨论】:
你试过了吗? 模板类的所有成员函数都是非模板的,除非它们本身用template
声明。但这可能不是您要问的。
如果你有类似这个模板的代码 从基类继承函数
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<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 对象的“胆量”进行相同的转发(如果有的话)。
【讨论】:
以上是关于模板类中的非模板函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章