c – 避免在模板专业化中重复功能定义

c – 避免在模板专业化中重复功能定义,第1张

概述类Widget具有一些适用于所有参数类型(常用函数)和其他需要专门用于给定类型(不常见的函数)的函数的函数. g坚持认为Widget的专业化还应该定义common_fn(),而不仅仅是uncommon_fn(),但是这首先违反了使用专业化的目的.如何避免重复common_fn()? #include <cassert>template<typename Type> struct Widget 类Widget具有一些适用于所有参数类型(常用函数)和其他需要专门用于给定类型(不常见的函数)的函数的函数.

g坚持认为Widget的专业化还应该定义common_fn(),而不仅仅是uncommon_fn(),但是这首先违反了使用专业化的目的.如何避免重复common_fn()?

#include <cassert>template<typename Type> struct Widget{    Widget() {}    char common_fn() { return 'a'; }    int uncommon_fn() { return 1; }};template<> struct Widget<char>{    Widget() {}    int uncommon_fn() { return 2; }};int main(){    Widget<char> WidgetChar;    assert( WidgetChar.common_fn() == 'a' ); // Error    assert( WidgetChar.uncommon_fn() == 2 );}

开始编辑

到阿尔夫:

我无法使用

template<> int Widget<char>::uncommon_fn() { return 2; }

因为一些不常见的函数需要返回一个trait类型(因此通过使实际的类型原语来简化是太过分了).

或者实际上是一种使编译器在写入时识别typename Foo :: bar的方法

struct Foo { typedef Foobar bar; };template<> typename Foo::bar Widget<Foo>::uncommon_fn() { return ....; }

最终编辑

开始,EDIT2

到iammilind:

这很有趣,但是由于同样的原因,我无法使用Widget的派生(或者可能更清楚的将公共部分重构为父类GeneralWidget的解决方案).共同的部分并不完全普遍.他们的声明和定义看起来是一样的,但由于他们使用特质,他们的结局是完全不同的.

最终EDIT2

解决方法
#include <assert.h>template<typename Type> struct Widget{    Widget() {}    char common_fn() { return 'a'; }    int uncommon_fn() { return 1; }};template<>int Widget<char>::uncommon_fn() { return 2; }int main(){    Widget<char> WidgetChar;    assert( WidgetChar.common_fn() == 'a' ); // OK    assert( WidgetChar.uncommon_fn() == 2 );}
总结

以上是内存溢出为你收集整理的c – 避免在模板专业化中重复功能定义全部内容,希望文章能够帮你解决c – 避免在模板专业化中重复功能定义所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1233410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存