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

时间:2019-01-22 12:12:59

标签: c++ std c++17

此问题与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!

1 个答案:

答案 0 :(得分:0)

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

如果使用any_castwstr转换为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