मैं कैसे प्राप्त कर सकता हूं std::typeindex प्रकार के वर्तमान में c++ में एक प्रकार द्वारा सहायता?

कहो मेरे पास एक प्रकार है:

using variant_t = std::variant<int, float, bool, double, std::string>;

मैं समारोह बनाने में सक्षम होना चाहता हूँ:

std::typeindex get_held_type(const variant_t& var);

यह सिर्फ जिज्ञासा के लिए है, मुझे पता है कि यह एक प्रकार में डेटा को संभालने का सामान्य तरीका नहीं है।

अगर मैं variant_t में एक और प्रकार जोड़ता हूं, तो मैं नहीं चाहता कि मुझे कोई अन्य कोड बदलना पड़े। यानी, प्रकारों को स्वयं पंजीकरण करने की आवश्यकता है।

यहाँ मेरा अब तक का प्रयास है। मैं थोड़ा धोखा देता हूं, क्योंकि मैं फ़ंक्शन के बजाय मानचित्र का उपयोग करता हूं, और रन टाइम पर प्रकारों को पंजीकृत करने के लिए एक ऑब्जेक्ट का निर्माण करना पड़ता है।

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

using variant_t = std::variant<int, float, bool, double, std::string>;
static constexpr size_t variant_t_size = std::variant_size<variant_t>();
static auto get_held_type = std::map<size_t, std::type_index>{};

//loop across all types in the variant
template<size_t N>
struct crtp : crtp<N - 1>{
    //ctor
    crtp(){
        get_held_type[N] = std::type_index(typeid (std::get<N>(variant_t{})));
    }
};

template<>
struct crtp<0>{
    //ctor
    crtp(){
        get_held_type[0] = std::type_index(typeid (std::get<0>(variant_t{})));
    }
};

static crtp<variant_t_size-1> registerTypes;

int main()
{
    variant_t var = 3.141;
    std::cout << get_held_type[var.index()].name() << std::endl;

}

लेकिन यह संकलक त्रुटि के साथ जीसीसी के साथ विफल रहता है:

/usr/include/c++/9/tuple:1674: error: no matching function for call to ‘std::type_index::type_index()’
 1674 |         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
      |                                                                      ^
0
Blue7 15 नवम्बर 2019, 20:18

1 उत्तर

सबसे बढ़िया उत्तर

std::visit सभी विकल्पों के साथ एक समान तरीके से व्यवहार करते समय काम आता है।

std::visit([](auto& v) -> std::type_index { return typeid(v); }, var)

पूर्ण डेमो:

#include <iostream>
#include <variant>
#include <string>
#include <typeindex>

using variant_t = std::variant<int, float, bool, double, std::string>;

int main() {
    variant_t var = 3.141;
    std::cout << std::visit([](auto& v) -> std::type_index { return typeid(v); }, var).name() << '\n';
}
3
cpplearner 15 नवम्बर 2019, 21:15