如何支持 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<wstr>
是错误的,因为std::any
不是模板。您是否在考虑std::variant
或std::optional
?
afaik any_cast
并不是真正在不同类型之间进行转换,而只是以类型安全的方式访问存储在 any
中的值
看起来您确实错过了 std::any 的要点。你到底想达到什么目的?你认为 std::any 有什么作用?
@Konchog:问题是,你不应该想要“重载/专门化”any_cast
。如果这就是您想要做的,那么您可能在其预期用例和目的之外使用any
。
【参考方案1】:
在 cppreference 中为 any_cast
给出的示例表明,将 int
强制转换为 std::string
会导致引发 bad_any_cast
异常。
如果使用any_cast
将wstr
转换为std::string
,结果将相同。
顺便说一句,std::any<wstr> 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 将自定义类转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章