文档章节

求模版函数地址

UMU
 UMU
发布于 2018/03/21 18:01
字数 368
阅读 60
收藏 0

最近用 WTL 写 Ribbon 界面,发现一个坑。

先看 WTL9.1 的代码

static void (CharFormat::*Getk_[])(IPropertyStore*) = 
{
    &CharFormat::Getk_Family, 
    &CharFormat::Getk_FontProperties_Size, 
    &CharFormat::Getk_MaskEffect<CFM_BOLD, CFE_BOLD, UI_PKEY_FontProperties_Bold>,
    &CharFormat::Getk_MaskEffect<CFM_ITALIC, CFE_ITALIC, UI_PKEY_FontProperties_Italic>,
    &CharFormat::Getk_MaskEffect<CFM_UNDERLINE, CFE_UNDERLINE, UI_PKEY_FontProperties_Underline>,
    &CharFormat::Getk_MaskEffect<CFM_STRIKEOUT, CFE_STRIKEOUT, UI_PKEY_FontProperties_Strikethrough>,
    &CharFormat::Getk_VerticalPositioning, 
    &CharFormat::Getk_Color<CFM_COLOR, UI_PKEY_FontProperties_ForegroundColor>, 
    &CharFormat::Getk_Color<CFM_BACKCOLOR, UI_PKEY_FontProperties_BackgroundColor>, 
    &CharFormat::Getk_ColorType<CFM_COLOR, CFE_AUTOCOLOR, UI_SWATCHCOLORTYPE_AUTOMATIC, UI_PKEY_FontProperties_ForegroundColorType>,
    &CharFormat::Getk_ColorType<CFM_BACKCOLOR, CFE_AUTOBACKCOLOR, UI_SWATCHCOLORTYPE_NOCOLOR, UI_PKEY_FontProperties_BackgroundColorType>,
};

其中 Getk_MaskEffect 是个模版函数,实现如下:

template <DWORD t_dwMask, DWORD t_dwEffects, REFPROPERTYKEY key>
void Getk_MaskEffect(IPropertyStore* pStore)
{
    if (SUCCEEDED(pStore->GetValue(key, &propvar)))
    {
        UIPropertyToUInt32(key, propvar, &uValue);
        if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
        {
            dwMask |= t_dwMask;
            dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? t_dwEffects : 0;
        }
    }	
}

然后,在 VS2017 编译失败了……

1>X:\WTL91_5321_Final\Include\atlribbon.h(422): error C2440: 'initializing': cannot convert from 'overloaded-function' to 'void (__thiscall WTL::RibbonUI::CharFormat::* )(IPropertyStore *)'

1>X:\WTL91_5321_Final\Include\atlribbon.h(422): note: None of the functions with this name in scope match the target type

然后根据错误提示搜到:Cannot take address of template function,https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39018,翻译一下:模版函数的地址转化,分两步走,第一步先转具化,第二步转目标类型,这样可以;直接转过去不可以!

再来看看 WTL10 怎么解决这个问题的!

static void (CharFormat::*Getk_[])(IPropertyStore*) = 
{
    &CharFormat::Getk_Family, 
    &CharFormat::Getk_FontProperties_Size, 
    &CharFormat::Getk_MaskEffectBold,
    &CharFormat::Getk_MaskEffectItalic,
    &CharFormat::Getk_MaskEffectUnderline,
    &CharFormat::Getk_MaskEffectStrikeout,
    &CharFormat::Getk_VerticalPositioning,
    &CharFormat::Getk_Color, 
    &CharFormat::Getk_ColorBack, 
    &CharFormat::Getk_ColorType,
    &CharFormat::Getk_ColorTypeBack,
};

原来的模版函数,已经替换成普通函数了……

void Getk_MaskEffectBold(IPropertyStore* pStore)
{
    Getk_MaskEffectAll(pStore, CFM_BOLD, CFE_BOLD, UI_PKEY_FontProperties_Bold);
}

void Getk_MaskEffectItalic(IPropertyStore* pStore)
{
    Getk_MaskEffectAll(pStore, CFM_ITALIC, CFE_ITALIC, UI_PKEY_FontProperties_Italic);
}

void Getk_MaskEffectUnderline(IPropertyStore* pStore)
{
    Getk_MaskEffectAll(pStore, CFM_UNDERLINE, CFE_UNDERLINE, UI_PKEY_FontProperties_Underline);
}

void Getk_MaskEffectStrikeout(IPropertyStore* pStore)
{
    Getk_MaskEffectAll(pStore, CFM_STRIKEOUT, CFE_STRIKEOUT, UI_PKEY_FontProperties_Strikethrough);
}

void Getk_MaskEffectAll(IPropertyStore* pStore, DWORD _dwMask, DWORD _dwEffects, REFPROPERTYKEY key)
{
    if (SUCCEEDED(pStore->GetValue(key, &propvar)))
    {
        UIPropertyToUInt32(key, propvar, &uValue);
        if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
        {
            dwMask |= _dwMask;
            dwEffects |= ((UI_FONTPROPERTIES)uValue == UI_FONTPROPERTIES_SET) ? _dwEffects : 0;
        }
    }
}

© 著作权归作者所有

UMU

UMU

粉丝 120
博文 112
码字总数 44043
作品 0
厦门
程序员
私信 提问
微信小程序入门五: wxml文件引用、模版、生命周期

实例内容 wxml文件引用(include、import) 模版 小程序生命周期 实例一: 方式引用文件 文件引用对于代码的重用非常重要,例如在web开发中我们可以将公用的部分和等部分进行提取,然后在需要...

lecepin
2017/01/19
0
0
VUE.js 掺杂 各种模版引擎 时候的使用场景

本人不是干前端的 , 最近看了下 Vue.js 的 . 有一些疑问 . 因为之前都是使用 jsp的el表达式取值.或者使用freemarker模版取值,又或者使用jfinal的TemplateEng取值 一般都是这样 ************...

丶Lion
2017/04/01
4.1K
5
自己动手——实现Dustjs中间件

原文地址:http://home4j.duapp.com/index.php/2014/06/01/diy-writing-a-dust-middleware.html Dustjs是我个人比较喜欢的一个JS模版引擎,原因有两个,一是,同时支持客户端和服务端渲染,模...

joshuazhan
2014/06/17
0
1
TemplateFx 2.37 发布,动态模版工具

TemplateFx 2.37 发布,此版本添加了 IPv6 地址操作功能到 "ip()"函数;支持智能 Undo 和 Redo 缓存片段;修复了一些 bug。 TemplateFx 是个动态模版工具,允许用户生成基于一个模版和一些源...

oschina
2014/06/05
401
0
TemplateFx 2.35 发布,动态模版工具

TemplateFx 2.35 发布,值得关注的改变包括对模板组件的支持,可在你的模板中引入外部文件;增加一些 JavaScript 助手函数用于操作 IP 地址;bug 的修复等。 TemplateFx 是个动态模版工具,允...

oschina
2014/04/25
240
0

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部