निम्नलिखित हेडर फाइल पर विचार करें:सी ++ में एमपीएल वेक्टर के सभी सदस्यों के लिए टेम्पलेट को स्पष्ट रूप से कैसे प्रारंभ करें?
// Foo.h
class Foo {
public:
template <typename T>
void read(T& value);
};
मैं स्पष्ट रूप से दृष्टांत के लिए सभी प्रकार के लिए एक स्रोत फ़ाइल में Foo::read
सदस्य समारोह टेम्पलेट चाहते शामिल एक boost::mpl::vector
में:
// Foo.cc
#include <boost/mpl/vector.hpp>
#include <boost/mpl/begin_end.hpp>
#include "Foo.h"
template <typename T>
void Foo::read(T& value) { /* do something */ }
typedef boost::mpl::vector<int, long, float> types;
// template Foo::read<int >(int&);
// template Foo::read<long >(long&);
// template Foo::read<float>(float&);
// instantiate automatically ???
क्या यह संभव है? अग्रिम धन्यवाद, डैनियल। तो फिर
// intermezzo
template <typename T> struct Bar {
Bar<T>() {
void (Foo::*funPtr)(T&) = &Foo::read<T>;
}
};
static Bar<int > bar1;
static Bar<long > bar2;
static Bar<float> bar3;
: कारण इन्स्टेन्शियशन यह एक struct के निर्माता है, जो चर का तो घोषित किया जाता है में Foo::read<T>
के सूचक के बताए कि लगता है, -
संपादित
मैं कुछ समाधान नहीं मिला प्रक्रिया को निम्नानुसार स्वचालित किया जा सकता है:
// Foo.cc continued
template <typename B, typename E>
struct my_for_each {
my_for_each<B, E>() {
typedef typename B::type T; // vector member
typedef void (Foo::*FunPtr)(T&); // pointer to Foo member function
FunPtr funPtr = &Foo::read<T>; // cause instantiation?
}
my_for_each<typename boost::mpl::next<B>::type, E> next;
};
template<typename E>
struct my_for_each<E, E> {};
static my_for_each< boost::mpl::begin<types>::type,
boost::mpl::end<types>::type > first;
लेकिन मुझे नहीं पता कि थाई एस समाधान पोर्टेबल और मानक अनुरूप है? (इंटेल और जीएनयू कंपाइलर्स के साथ काम करता है।)
nitpick: सवाल एक बालक स्पष्ट हो सकता है अगर आपके 'Foo' वर्ग वास्तव में' Foo.h' – Mat
@nitpick में एक 'read' सदस्य सिर: संपादित, मेरी गलती है, धन्यवाद –
पूर्वप्रक्रमक का उपयोग कर के लघु आधारित समाधान, मुझे नहीं लगता कि यह संभव है। –