मुझे यह https://gist.github.com/2945472 मिला लेकिन मुझे एक कार्यान्वयन की आवश्यकता है जो सी ++ 11 पर निर्भर नहीं है। मैंने इसे केवल बढ़ावा देने के लिए परिवर्तित करने के लिए अपने हाथ की कोशिश की, लेकिन मुझे कुछ परेशानी हो रही है।बूस्ट के लिए आगंतुक पैटर्न :: कोई
#include <boost/any.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/unordered_map.hpp>
struct type_info_hash {
std::size_t operator()(std::type_info const & t) const {
return t.hash_code();
}
};
struct equal_ref {
template <typename T> bool operator()(boost::reference_wrapper<T> a,boost::reference_wrapper<T> b) const {
return a.get() == b.get();
}
};
struct any_visitor {
boost::unordered_map<boost::reference_wrapper<std::type_info const>, boost::function<void(boost::any&)>, type_info_hash, equal_ref> fs;
template <typename T> void insert_visitor(boost::function<void(T)> f) {
try {
fs.insert(std::make_pair(boost::ref(typeid(T)), boost::bind(f, boost::any_cast<T>(boost::lambda::_1))));
} catch (boost::bad_any_cast& e) {
std::cout << e.what() << std::endl;
}
}
bool operator()(boost::any & x) {
boost::unordered_map<boost::reference_wrapper<std::type_info const>, boost::function<void(boost::any&)>, type_info_hash, equal_ref>::iterator it = fs.find(boost::ref(x.type()));
if (it != fs.end()) {
it->second(x);
return true;
} else {
return false;
}
}
};
struct abc {};
void fa(int i) { std::cout << "fa(" << i << ")" << std::endl; }
void fb(abc) { std::cout << "fb(abc())" << std::endl; }
int main() {
any_visitor f;
f.insert_visitor<int>(fa);
f.insert_visitor<abc>(fb);
std::vector<boost::any> xs;
xs.push_back(1);
xs.push_back(abc());
xs.push_back(1.5);
for (auto & x : xs) {
if (!f(x)) std::cout << "no visitor registered" << std::endl;
}
}
जब नक्शा में डालने मैं एक bad_any_cast हो रही है:
यहाँ मैं के साथ आया है। किसी भी_कास्ट को केवल इसके द्वारा बुलाया नहीं जाना चाहिए-> दूसरा (x)? मैं क्या गलत कर रहा हूं?
क्या आपने 'boost :: variant' का उपयोग करने पर विचार किया है जिसके लिए आगंतुकों को बॉक्स से बाहर समर्थित किया जाता है? 'किसी भी' का उपयोग यह मानता है कि प्रकार * कुछ * हो सकते हैं, जो * सभी प्रकार के प्रकार सिस्टम में हैं। 'variant' मानता है कि उस प्रकार का सबसेट है जिसे आप ऑब्जेक्ट में उपयोग करना चाहते हैं। एक आगंतुक 'variant' के करीब है क्योंकि विभिन्न कार्यों को परिभाषित किया जाना चाहिए। –
मेरा इरादा बूस्ट :: program_options से कॉन्फ़िगरेशन फ़ाइलों को लिखने के लिए इसका उपयोग करना है, जो boost :: किसी भी का उपयोग करता है। – Keith