c++ - 异构HashMap c++

标签 c++ hashmap unions variadic-functions boost-any

我尝试将不同的数据类型保存在一个 HashMap 中。

HashMap 将在可变参数函数中创建。

结构和 Boost::Any 下的 union 对我不起作用,
union 不接受类作为数据类型。 Boost::any 在我通过可变参数时给我错误。

有什么建议吗?

请告诉我是否应该提供更多详细信息。

使用 boost::any 编写代码

#include <iostream>
#include <string>
#include <cstdarg>
#include <boost/any.hpp>
#include <boost/variant.hpp>

class vec3D{
 public:
    int x;
    vec3D(int p){ x=p;}
 };

using namespace std;

struct testing{
    enum Type {U32, U64, I32, I64, D, S, B, ENDNOW};
    Type val;
    boost::any Point;

};

void mandatory(int count...){
    va_list args;
    va_start(args, count);
    testing tester;
    for ( tester.val=va_arg(args, testing::Type) ; tester.val != testing::ENDNOW ; tester.val=va_arg(args, testing::Type) ){
    //for (testing tester.val = va_arg(args, testing->Type); tester.val != 11; tester=va_arg(args, testing->Type) ){
        switch(tester.val) {
            case 0: cout<< "u32"; tester.Point = va_arg(args, uint32_t); break;
            case 1: cout<< "u64"; tester.Point = va_arg(args, uint64_t); break;
            case 2: cout<< "32"; tester.Point = va_arg(args, int32_t); break;
            case 3: cout<< "64"; tester.Point = va_arg(args, int64_t); break;
            case 4: cout<< "double"; tester.Point = va_arg(args, double); break;
            //case 5: cout<< "string"; tester.Point = va_arg(args, string); break;
            case 6: cout<< "boolean"; tester.Point = va_arg(args, bool); break;
            case 7: cout<< "EndNow"; break;
            default: break; //this is the end now.
        }
        cout<<'\t'<<tester.Point<<endl;
    }
    va_end(args);
    cout<<endl;
}

int main(){
    mandatory(12, testing::U32, 99, testing::B, 0, testing::D,11E1, testing::I64,5000000, testing::ENDNOW);
    return 0;
}

带有 boost::variant 的代码

#include <iostream>
#include <string>
#include <cstdarg>
#include <boost/any.hpp>
#include <boost/variant.hpp>

class vec3D{
 public:
    int x;
    vec3D(int p){ x=p;}
 };

using namespace std;

struct testing{
    enum Type {U32, U64, I32, I64, D, S, B, ENDNOW};
    Type val;
    typedef boost::variant<uint32_t, uint64_t, int32_t, int64_t, double, string, bool, vec3D> point;
    point Point;

};

void mandatory(int count...){
    va_list args;
    va_start(args, count);
    testing tester;
    for ( tester.val=va_arg(args, testing::Type) ; tester.val != testing::ENDNOW ; tester.val=va_arg(args, testing::Type) ){
        switch(tester.val) {
            case 0: cout<< "u32"; tester.Point = va_arg(args, uint32_t); break;
            case 1: cout<< "u64"; tester.Point = va_arg(args, uint64_t); break;
            case 2: cout<< "32"; tester.Point = va_arg(args, int32_t); break;
            case 3: cout<< "64"; tester.Point = va_arg(args, int64_t); break;
            case 4: cout<< "double"; tester.Point = va_arg(args, double); break;
            //case 5: cout<< "string"; tester.Point = va_arg(args, string); break;
            case 6: cout<< "boolean"; tester.Point = va_arg(args, bool); break;
            case 7: cout<< "EndNow"; break;
            default: break; //this is the end now.
        }
        cout<<'\t'<<tester.Point<<endl;
    }
    va_end(args);
    cout<<endl;
}

int main(){
    mandatory(12, testing::U32, 99, testing::B, 0, testing::D,11E1, testing::I64,5000000, testing::ENDNOW);
    return 0;
}

最佳答案

对于 variant,它可以是:

#include <iostream>
#include <string>
#include <variant>
#include <vector>

class vec3D{
 public:
    int x;
    vec3D(int p){ x=p;}
 };

struct testing{
    using point = std::variant<std::uint32_t, std::uint64_t, std::int32_t,
                               std::int64_t, double, std::string, bool, vec3D>;
    point Point;
};

struct Visitor
{
    void operator() (std::uint32_t) const { std::cout << "u32" << std::endl; }
    void operator() (std::uint64_t) const { std::cout << "u64" << std::endl; }
    void operator() (std::int32_t) const { std::cout << "32" << std::endl; }
    void operator() (std::int64_t) const { std::cout << "64" << std::endl; }
    void operator() (double) const { std::cout << "double" << std::endl; }
    void operator() (const std::string&) const { std::cout << "string" << std::endl; }
    void operator() (bool) const { std::cout << "bool" << std::endl; }
    void operator() (const vec3D&) const { std::cout << "Vec3D" << std::endl; }
};

template <typename ... Ts>
void mandatory(Ts ... args){
    std::vector<testing> testings;

    (std::visit(Visitor{}, testing::point(args)), ...);
    (testings.push_back({args}), ...);
}

int main(){
    mandatory(std::uint32_t(99u), false, 11.42,
              std::int64_t(5000000), std::string("Hello world"), vec3D{42});
}

Demo

关于c++ - 异构HashMap c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44315595/

相关文章:

c++ - JNI/C++编译问题

hashmap - 如何从 dataweave 2.0 中的有效负载访问 hashmap 值?

c++ - 如何从 C++ 中的内部 union 访问类成员

c++ - std::forward 没有完美转发?

c++ - 将 C++ 类私有(private)变量转换为公共(public)变量

c++ - equal_range 应该如何工作?

c++ - C++中将不同类型的变量存储在一个实体中

c++ - 哈希表桶实现

java - 遍历 hashmap - 抛出异常

c++ - union 可以模板化吗?