C++模板部分特化 - 仅特化一个成员函数
遇到另一个模板问题:
问题:我想部分专门化容器类(foo)来处理对象是指针的情况,并且我只想专门化删除方法。应该如下所示:
lib 代码
template <typename T>
class foo
{
public:
void addSome (T o) { printf ("adding that object..."); }
void deleteSome (T o) { printf ("deleting that object..."); }
};
template <typename T>
class foo <T *>
{
public:
void deleteSome (T* o) { printf ("deleting that PTR to an object..."); }
};
用户代码
foo<myclass> myclasses;
foo<myclass*> myptrs;
myptrs.addSome (new myclass());
这会导致编译器告诉我 myptrs 没有名为 addSome 的方法。 为什么 ?
谢谢。
解决方案
based on tony's answer here the fully compilable stuff库
template <typename T>
class foobase
{
public:
void addSome (T o) { printf ("adding that object..."); }
void deleteSome (T o) { printf ("deleting that object..."); }
};
template <typename T>
class foo : public foobase<T>
{ };
template <typename T>
class foo<T *> : public foobase<T *>
{
public:
void deleteSome (T* o) { printf ("deleting that ptr to an object..."); }
};
用户
foo<int> fi;
foo<int*> fpi;
int i = 13;
fi.addSome (12);
fpi.addSome (&i);
fpi.deleteSome (12); // compiler-error: doesnt work
fi.deleteSome (&i); // compiler-error: doesnt work
fi.deleteSome (12); // foobase::deleteSome called
fpi.deleteSome (&i); // foo<T*>::deleteSome called
Bumped into another templates problem:
The problem: I want to partially specialize a container-class (foo) for the case that the objects are pointers, and i want to specialize only the delete-method. Should look like this:
The lib code
template <typename T>
class foo
{
public:
void addSome (T o) { printf ("adding that object..."); }
void deleteSome (T o) { printf ("deleting that object..."); }
};
template <typename T>
class foo <T *>
{
public:
void deleteSome (T* o) { printf ("deleting that PTR to an object..."); }
};
The user code
foo<myclass> myclasses;
foo<myclass*> myptrs;
myptrs.addSome (new myclass());
This results into the compiler telling me that myptrs doesnt have a method called addSome.
Why ?
Thanx.
Solution
based on tony's answer here the fully compilable stuff
lib
template <typename T>
class foobase
{
public:
void addSome (T o) { printf ("adding that object..."); }
void deleteSome (T o) { printf ("deleting that object..."); }
};
template <typename T>
class foo : public foobase<T>
{ };
template <typename T>
class foo<T *> : public foobase<T *>
{
public:
void deleteSome (T* o) { printf ("deleting that ptr to an object..."); }
};
user
foo<int> fi;
foo<int*> fpi;
int i = 13;
fi.addSome (12);
fpi.addSome (&i);
fpi.deleteSome (12); // compiler-error: doesnt work
fi.deleteSome (&i); // compiler-error: doesnt work
fi.deleteSome (12); // foobase::deleteSome called
fpi.deleteSome (&i); // foo<T*>::deleteSome called
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
第二种解决方案(正确的一个)
根据 Core,该解决方案是有效的问题#727。
第一个(不正确的)解决方案:(将其保留为评论所引用的内容)
您不能仅专门化课程的一部分。在您的情况下,最好的方法是重载函数
deleteSome
,如下所示:Second solution (correct one)
This solution is valid according to Core Issue #727.
First (incorrect) solution: (kept this as comments refer to it)
You cannot specialize only part of class. In your case the best way is to overload function
deleteSome
as follows:另一个解决方案。使用辅助函数
deleteSomeHelp
。Another solution. Use the auxiliary function
deleteSomeHelp
.我还没有看到这个解决方案,使用boost的
启用_if
,is_same
和remove_pointer
获取类中的两个函数,没有任何继承或其他缺陷。请参阅下面的仅使用
remove_pointer
的版本。一个简化的版本是:
它适用于 MSVC 9:(注释掉给出错误的行,因为它们不正确,但很适合测试)
I haven't seen this solution yet, using boost's
enable_if
,is_same
andremove_pointer
to get two functions in a class, without any inheritance or other cruft.See below for a version using only
remove_pointer
.A simplified version is:
And it works on MSVC 9: (commented out lines that give errors, as they are incorrect, but good to have for testing)
为单个函数创建基类
deleteSome
进行部分特化
使用您的基类
Create base class for single function
deleteSome
Make partial specialization
Use your base class
您可以使用继承来使其发挥作用:
You can use inheritance to get this to work :