使用特征时避免部分模板特化中函数定义的重复
如何在所有专业化中共享 common_fn() (对于 Widget >
和 Widget >
,无论 T 是什么)在下面的代码中?
#include <cassert>
struct Afoo {};
struct Bfoo {};
template<typename T> struct A { typedef Afoo Foo; };
template<typename T> struct B { typedef Bfoo Foo; };
template<typename Type> struct Widget
{
Widget() {}
typename Type::Foo common_fn() { return Type::Foo(); }
int uncommon_fn() { return 1; }
};
template<typename T> struct Widget<A<T> >
{
Widget() {}
int uncommon_fn() { return 2; }
};
int main()
{
Widget<A<char> > WidgetAChar;
assert( WidgetAChar.common_fn() == Afoo() ); // Error
assert( WidgetAChar.uncommon_fn() == 2 );
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有点不清楚您的目标是什么,特别是
uncommon_fn
是否真的如图所示简单,或者可能更简单。但无论如何,对于给出的示例代码,请考虑……
将其推广到处理更通用的
uncommon_fn
应该不难。您还可以考虑 @iammilind 为您之前的问题展示的继承技巧。实际上可能更简单。然而,它增加了访问可能“错误”的函数实现的可能性。
干杯&嗯。
It's a little unclear what you're aiming for, in particular whether
uncommon_fn
is really as simple as illustrated, or might be more.But anyway, for the example code given, consider …
Generalizing this to handle a more general
uncommon_fn
shouldn't be hard.You might also consider the inheritance trick that @iammilind showed for your previous question. It might be practically simpler. However, it adds the possibility of accessing a possibly "wrong" function implementation.
Cheers & hth.