如何支持 any_cast 将自定义类转换为字符串?

Posted

技术标签:

【中文标题】如何支持 any_cast 将自定义类转换为字符串?【英文标题】:How do I support any_cast to cast a custom class to a string? 【发布时间】:2019-01-22 12:12:58 【问题描述】:

此问题与Type erasing type erasure, `any` questions?有关

给定下面的 wstr 类(只是一个字符串包装器)

class wstr 
public:
    std::string text;
;

我有一个...

std::any myAny(myWstr);

..我想将它转换为字符串..

std::string myString = std::any_cast<std::string>(myAny);

...有没有办法通过使用模板专业化来做到这一点,或者(我怀疑)这是否错过了使用 std::any 的意义?

这个问题与隐式转换无关。我在想我可能需要编写一个友元函数/重载演员表,类似于编写 ostream 运算符扩展。

问这个问题的另一种方法是:我认为 std::any_cast 不会投射到任何东西,而是只将 std::any 投射回其原始形式是否正确,因此不能重载一个函数支持转换为例如 std::string,并且(出于某种原因)不可用于友元函数重载/模板专业化?

wstr myWstr("foo");
std::any myAny(myWstr);
wstr myWstr = std::any_cast<wstr>(myAny); //is okay.
std::string mMytr = std::any_cast<std::string>(myAny); //No overloads!

【问题讨论】:

不久前请参阅我的question。您不能将 any_cast 转换为另一种类型。 std::any&lt;wstr&gt; 是错误的,因为std::any 不是模板。您是否在考虑std::variantstd::optional afaik any_cast 并不是真正在不同类型之间进行转换,而只是以类型安全的方式访问存储在 any 中的值 看起来您确实错过了 std::any 的要点。你到底想达到什么目的?你认为 std::any 有什么作用? @Konchog:问题是,你不应该想要“重载/专门化”any_cast。如果这就是您想要做的,那么您可能在其预期用例和目的之外使用any 【参考方案1】:

在 cppreference 中为 any_cast 给出的示例表明,将 int 强制转换为 std::string 会导致引发 bad_any_cast 异常。

如果使用any_castwstr 转换为std::string,结果将相同。

顺便说一句,std::any&lt;wstr&gt; myAny; 不起作用,因为std::any 是一个类而不是一个模板。

相反,您可以通过以下方式对其进行测试:

#include <string>
#include <iostream>
#include <any>

class wstr 
public:
    std::string text;
;

int main()

    wstr ws;
    auto a = std::any(ws);

    try 
        std::cout << std::any_cast<std::string>(a) << '\n';
    
    catch(const std::bad_any_cast& e) 
        std::cout << e.what() << '\n';
    

见demo here。

【讨论】:

谢谢,但由于我最初的问题很贫乏,这没有抓住重点。我要说的是关于扩展/重载 std::any_cast,而不是期望它像它那样进行演员表立场。 @Konchog:那么您将不得不编写自己的转换函数、构造函数或运算符。 std::any_cast 不是这样做的方法。

以上是关于如何支持 any_cast 将自定义类转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

boost::any_cast 到我的自定义类

无法将自定义数据类型转换为字符串?

如何使用 toDF() 将自定义 Java 类对象的 RDD 转换为 DataFrame?

如何防止 gorm 将自定义整数类型转换为字符串?

我可以将自定义类转换为刀片 Laravel 中的变量吗

将自定义javascript对象转换为json [重复]