首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有转换的c++/winrt中的开箱数值

具有转换的c++/winrt中的开箱数值
EN

Stack Overflow用户
提问于 2020-09-09 13:37:48
回答 2查看 300关注 0票数 0

是否有一种方法可以打开数字值而不考虑类型?为了前夫。对int进行装箱,然后取消对doublelong long的装箱(如果转换是可能的)。关键是,如果转换是可能的,则可以将未知类型解压缩为已知类型。

现在它的表现如下:

代码语言:javascript
运行
复制
winrt::Windows::Foundation::IInspectable boxed_value = winrt::box_value(30);
int i = winrt::unbox_value<int>(boxed_value); //OK
double d = winrt::unbox_value<double>(boxed_value); //Exception

我想要这样的东西:

代码语言:javascript
运行
复制
winrt::Windows::Foundation::IInspectable boxed_value = winrt::box_value(30);
int i = unbox_value_with_conversion<int>(boxed_value); //OK
double d = unbox_value_with_conversion<double>(boxed_value); //OK
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-10 07:02:55

如果您不知道(或者不关心)哪种类型的值已经装箱,那么使用IReference<T>就不好玩了。链接一组unbox_value/unbox_value_or调用将引发一系列QueryInterface调用,这是一种非常低效率的方法。更好的做法是使用IPropertyValue。它已经执行标量转换,并处理溢出之类的错误。

代码语言:javascript
运行
复制
winrt::Windows::Foundation::IInspectable boxed_value = winrt::box_value(30);
int i = boxed_value.as<winrt::Windows::Foundation::IPropertyValue>().GetInt32();
double d = boxed_value.as<winrt::Windows::Foundation::IPropertyValue>().GetDouble();

如果您愿意,这应该是一个简单的练习(如果有点重复/乏味),为您的unbox_value_with_conversion提供模板专门化。

代码语言:javascript
运行
复制
template <typename T>
T unbox_value_with_conversion(winrt::Windows::Foundation::IInspectable const& value)
{
  return winrt::unbox_value<T>(value);
}

template <>
int32_t unbox_value_with_conversion<int32_t>(winrt::Windows::Foundation::IInspectable const& value)
{
  return value.as<winrt::Windows::Foundation::IPropertyValue>().GetInt32();
}

// Rest of specializations...
票数 2
EN

Stack Overflow用户

发布于 2020-09-10 05:35:48

要实现一种无论类型如何打开数值的方法,您可以尝试将自动类型转换包装到unbox_value_with_conversion方法中,并以您提到的int、double和long long类型为例。

函数声明

代码语言:javascript
运行
复制
template<class T>

T unbox_value_with_conversion(winrt::Windows::Foundation::IInspectable const& value);

函数定义

代码语言:javascript
运行
复制
template<class T>

inline T MainPage::unbox_value_with_conversion(winrt::Windows::Foundation::IInspectable const& value)
{
    T res{};
    auto vv = value.as<winrt::Windows::Foundation::IPropertyValue>();
    if (vv.Type() == winrt::Windows::Foundation::PropertyType::Int32)
    {
        int32_t tt = vv.as<int32_t>();
        res = (T)tt;
        return res;
    }
    if (vv.Type() == winrt::Windows::Foundation::PropertyType::Double)
    {
        double dd = vv.as<double>();
        res = (T)dd;
        return res;
    }
    if (vv.Type() == winrt::Windows::Foundation::PropertyType::Int64)
    {
        long long llong = vv.as<long long>();
        res = (T)llong;
        return res;
    }
    return T();
}

型转换

代码语言:javascript
运行
复制
winrt::Windows::Foundation::IInspectable boxed_value1 = winrt::box_value(30);
double dd1 = unbox_value_with_conversion<double>(boxed_value1);
long long llong1= unbox_value_with_conversion<long long>(boxed_value1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63812908

复制
相关文章

相似问题

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