是否可以使用std :: vector <std :: any> vec;这将导致异构数据类型

时间:2019-08-09 11:32:12

标签: c++ c++17

是否可以定义std::vector<std::any> vec

https://www.bfilipek.com/2018/06/any.html#message-passing //您可以在容器中使用它:

std::map<std::string, std::any> m;
m["integer"] = 10;
m["string"] = std::string("Hello World");
m["float"] = 1.0f;
std::vector<std::any> vec;

我们可以有类似的东西

class a
{
   int val;
}

class b
{
   float val;
}

vec.emplaceback(a);
vec.emplaceback(b);

2 个答案:

答案 0 :(得分:0)

是的,这是可能的。

std::any只是带有值语义的void*周围的类型安全包装。

请参见live demo here中复制粘贴正确的代码。

答案 1 :(得分:0)

是的,我有一个示例可用于将可变参数模板包转换为运行时。它并不会对传递的参数进行复制,并且会在每次传递时擦除向量,但并未对其进行优化,但是它演示了这一想法(实际上,您将使用for循环和std::ref<>):

template<typename ... many>
void safe_printf(const char *s, many ... args)
{   
    using namespace std;
    vector<any> a = {args ...};

    while (*s) {
        if (*s == '%') {
            if (*(s + 1) == '%') {
                ++s;
            }
            else {

                if (a.empty())
                    throw std::logic_error("Fewer arguments provided to printf");

                if (a[0].type() == typeid(string)) cout << any_cast<string>(a[0]);
                if (a[0].type() == typeid(int)) cout << any_cast<int>(a[0]);
                if (a[0].type() == typeid(double)) cout << any_cast<double>(a[0]);

                a.erase(a.begin());
                s++;
            }
        }
        cout << *s++;
    }
}

int main()
{
 safe_printf("Hello % how are you today? I have % eggs and your height is %","Jack"s, 32,5.7);
 // Hello Jack how are you today? I have 32 eggs and your height is 5.7
}

当然是std::any本身不是模板,但是它依赖于运行时检查来查看其存储的指针类型。