रूप @Mankarse सही ढंग से निर्दिष्ट आप:
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/container.hpp>
struct F {
F(int blah): blah(blah){}
template <typename T>
void operator()(T& t) const {
t = blah;
}
int blah;
};
template <typename T>
void some_method(T &t)
{
boost::fusion::for_each(t, F(6));
}
int main() {
boost::fusion::vector<int, double, int> idi;
some_method(idi);
boost::fusion::vector<int, double> id;
some_method(id);
}
की कोशिश में for_each
रहस्यमय नहीं रखना, यहाँ कुछ ज्यादातर बराबर कोड बजाय संख्यात्मक सूचकांक का उपयोग करता है fusion
for
लूप में कंटेनर का उपयोग नहीं कर सकते हैं और ऐसा इसलिए है क्योंकि fusion
कंटेनर tuple
हैं और प्रत्येक तत्व के पास अलग-अलग प्रकार हो सकते हैं अन्य तत्व, fusion
कंटेनर के माध्यम से पुनरावृत्त करने वाले सभी फ़ंक्शन वास्तव में कुछ फ़ंक्शन हैं और आमतौर पर template
या अधिभारित फ़ंक्शंस के रूप में कार्यान्वित किए जाते हैं। इसलिए कंटेनर को vector
से प्रारंभ करने के लिए आपके पास एकाधिक फ़ंक्शन (या केवल एक टेम्पलेट जो एकाधिक कक्षाओं या कार्यों में संकलित किया जाएगा) होना चाहिए, जिनके पास उस वेक्टर तक पहुंच है (या कम से कम vector
और एक राज्य से एक इटरेटर वेरिएबल जो प्रत्येक कॉल के लिए बढ़ाया जा सकता है)।
1) को बढ़ावा देने :: संलयन :: गुना का उपयोग करें:: तो आप 2 विकल्प हैं
template< class StdIteratorT >
struct initialize_fusion_container_from_std_iterator {
typedef StdIteratorT result_type;
template< class T >
StdIteratorT operator()(StdIteratorT i, T& val) {
val = *i;
return ++i;
}
};
void use_fold_demo() {
int p1[] = {4, 5, 6};
fusion::vector<int, double, int> fv;
std::vector<int> sv2(p1, p1 + _countof(p1));
fusion::fold(fv, sv2.begin(),
initialize_fusion_container_from_std_iterator<std::vector<int>::iterator>());
}
2) एक समारोह है कि रिकर्सिवली कंटेनर के अगले आइटम के साथ ही फोन लिखें (इस समारोह की वाक्य रचना है याद पुनरावर्ती कार्यों लेकिन जैसे कि यह बिल्कुल पुनरावर्ती नहीं है):
// this will be called when we reach end of the fusion container(FIBeginT==FIEndT)
template< class FIBeginT, class FIEndT, class StdIteratorT >
void set_fusion_iterator(FIBeginT b, FIEndT e, StdIteratorT i, boost::mpl::true_)
{
}
// this will be called when FIBeginT != FIEndT
template< class FIBeginT, class FIEndT, class StdIteratorT >
void set_fusion_iterator(FIBeginT b, FIEndT e, StdIteratorT i, boost::mpl::false_)
{
*b = *i;
set_fusion_iterator(fusion::next(b), e, ++i,
fusion::result_of::equal_to<
typename fusion::result_of::next<FIBeginT>::type, FIEndT >());
}
void recursive_function_demo() {
typedef fusion::vector<int, double, int> my_fusion_vector;
int p1[] = {1, 2, 3};
std::vector<int> sv1(p1, p1 + _countof(p1));
fusion::vector<int, double, int> fv;
set_fusion_iterator(fusion::begin(fv), fusion::end(fv), sv1.begin(),
fusion::result_of::equal_to<
typename fusion::result_of::end<my_fusion_vector>::type,
typename fusion::result_of::begin<my_fusion_vector>::type>());
}
आप दूसरे मामले को देखने के रूप में और अधिक जटिल है, लेकिन अगर आप अपने तर्क को समझने आप fusion
कंटेनर के साथ कुछ भी कर के लिए इसका इस्तेमाल कर सकते हैं, इसलिए पसंद है सब तुम्हारा!!
'blah' क्या है? एक सीधी फॉर-लूप कभी काम नहीं करेगा, क्योंकि 'ब्लाह' के प्रत्येक पुनरावृत्ति पर एक अलग प्रकार होना चाहिए (आपको एक पुनरावर्ती टेम्पलेट फ़ंक्शन लिखना होगा)। क्या आप इस तरह के कुछ उदाहरण प्रदान कर सकते हैं कि आप मूल्यों का प्रतिनिधित्व कर रहे हैं? – Mankarse
मुझे लगता है कि जो मूल्य डाले जाएंगे उन्हें उचित प्रकार पर उचित रूप से डाला जाएगा। तर्क के लिए आप कल्पना कर सकते हैं कि 'ब्लाह' एक 'int' है। – arlogb
वे _runtime_ पर निर्धारित नहीं होंगे, वे _compile-time_ पर निर्धारित किए जाएंगे। –