【发布时间】: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。