首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为特定类型的访问函数编写通用的模板化包装器?

如何为特定类型的访问函数编写通用的模板化包装器?
EN

Stack Overflow用户
提问于 2019-04-11 05:42:07
回答 2查看 95关注 0票数 1

我正在尝试为xml库编写一个通用包装器,它可以在C++中保存和存储值。

它们已经将其xml节点属性(存储为字符串)访问函数实现为attribute.as_int()attribute.as_bool()等函数。

我希望实现在nlohmann::json库中看到的相同功能,在这个库中,您可以对一些json对象调用.get<T>()并获取一些类型。

我能想到的唯一方法(甚至可能行不通)就是使用模板专门化:

代码语言:javascript
复制
template <>
int foo<int>(xml_attribute param)
{
    return param.as_int();
}

template <>
bool foo<bool>(xml_attribute param)
{
    return param.as_bool();
}

以此类推。

这似乎导致了几乎与编写非泛型包装器一样多的代码...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-11 07:09:37

我们可以使用额外的参数根据类型创建不同的重载,然后使用重载解析来找到正确的函数。TypeTag是一个空类,我们可以用它来区分不同的重载:

代码语言:javascript
复制
template<class T>
struct TypeTag{ /* empty */ };

一旦有了这些,我们就可以编写基于标记的read_as函数:

代码语言:javascript
复制
int read_as(xml_attribute param, TypeTag<int>) {
    return param.as_int(); 
}
bool read_as(xml_attribute param, TypeTag<bool>) {
    return param.as_bool(); 
}
float read_as(xml_attribute param, TypeTag<float>) {
    return param.as_float(); 
}
double read_as(xml_attribute param, TypeTag<double>) {
    return param.as_double();
}
const pugi::char_t* read_as(xml_attribute param, TypeTag<const pugi::char_t*) {
    return param.as_string(); 
}

创建通用模板现在非常简单:

代码语言:javascript
复制
template<class T>
T read_as(xml_attribute param) {
    return read_as(param, TypeTag<T>()); 
}

此解决方案在C++11中工作,它的编译速度将比一系列if constexpr检查更快,因为编译器可以通过重载解析来查找正确的版本,而不必进行一系列检查。

票数 1
EN

Stack Overflow用户

发布于 2019-04-11 05:55:07

嗯,你的方法实际上并不是那么糟糕。我可能会坚持下去。

然而,还有另一种方法。

代码语言:javascript
复制
#include <type_traits>

template <typename T>
auto foo(xml_attribute param)
{
    if constexpr (std::is_same<T, int>::value) {
          return param.as_int();
    }
    else if constexpr (/*..*/){//...} //and so on
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55621708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档