此问题与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!
答案 0 :(得分:0)
在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。