【发布时间】:2010-11-04 17:04:28
【问题描述】:
假设我有一个模板类:
template <typename T>
class foo {
void do_someting(T obj) {
// do something generic...
}
};
我想专门化 do_something,但在其中我想调用“正常”的 do_something 函数:
template<>
void foo<MyObj>::do_something(MyObj obj) {
// do something specific...
// and ALSO do something generic!
}
有没有办法在我的专用函数中引用 do_something 的正常版本?还是我只需要复制代码?
(我知道我可以重构 foo,这样我就不会遇到这个确切的问题,但碰巧我不能真正修改“真正的”foo,因为它是高度共享的代码。)
【问题讨论】:
-
对于
MyObj类型没有“正常”版本的do_something- 模板特化的全部效果是替换您将获得的实例化基本模板,带有您在专业化中定义的类/函数。 -
对,但是编译器知道 foo
::do_something 中的代码,它没有理由不让我以某种方式引用它。不过,我完全愿意相信这种语言功能根本不存在——这就是我想要找出的。 -
@Steve Townsend——这是一个不同的问题。那就是问你如何才能拥有一个具有一些专门功能和一些非专门功能的类。
-
“它没有理由不让我以某种方式引用它” - 如果模板以完全不同的方式定义,那就没有理由了。事实上,
foo<MyObj>是一个类,它有一个do_something函数,并且该函数由特化定义。如果使用参数MyObj实例化基本模板foo,则结果将是另一个 类,也是foo<MyObj>,这是不允许的,这就是障碍。我想如果该语言以某种方式让您将基本模板实例化为不同的名称,您可能会没事,但没有这样的运气。
标签: c++ templates template-specialization