2017-06-01 27 views
0

我有不同的數據類型,我試圖保存在一個HashMap中。異構HashMap C++

HashMap將在變量參數函數內部創建。

結構和Boost下的工會::任何工具都不適合我,
工會不接受類作爲數據類型。 Boost ::任何給我錯誤,當我通過可變參數。

有什麼建議嗎?

請告訴我,如果我應該提供更多的細節。

代碼的boost ::任何

#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 ::變種

#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; 
} 
+0

你需要蘇輸入任何類型或只是一組類型?如果是後者考慮使用boost/std變體。 – NathanOliver

+0

@NathanOliver沒有與用戶定義的類一起工作。 –

+1

定義「沒有工作」。 '任何'/'變種'聽起來像你所需要的。如果你無法正常工作,你可以隨時發佈[mcve]並尋求幫助解決問題。 – NathanOliver

回答

1

隨着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