Wie @Mankarse korrekt angegeben, Sie kann fusion
Behälter in einer for
Schleife nicht verwenden, und das ist, weil fusion
Behälter alles über tuple
sind und jedes Element möglicherweise unterschiedliche Art von hat andere Elemente, alle Funktionen, die durch einen fusion
Container durchlaufen, sind eigentlich ein paar Funktionen und normalerweise als template
oder überladene Funktionen implementiert. Um also einen fusion
Container von vector
zu initialisieren, sollten Sie mehrere Funktionen haben (oder einfach eine Vorlage, die zu mehreren Klassen oder Funktionen kompiliert wird), die alle Zugriff auf diesen Vektor haben (oder mindestens einen Iterator von vector
und einen Zustand) Variable, die für jeden Aufruf erhöht werden kann). So haben Sie 2 Möglichkeiten:
1) Verwenden Sie boost :: Fusion :: fach:
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) Schreiben Sie eine Funktion, die sich selbst rekursiv aufrufen mit dem nächsten Punkt des Behälters (erinnern Syntax dieser Funktion ist wie rekursive Funktionen, aber es ist überhaupt nicht rekursiv):
// 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>());
}
wie Sie zweiten Fall sehen viel komplizierter ist, aber wenn man seine Logik verstehen kann man es etwas mit fusion
Containern zu tun verwenden, so dass die Wahl ist alles von dir !!
Was ist 'blah'? Eine direkte For-Schleife wird niemals funktionieren, weil 'blah' bei jeder Iteration einen anderen Typ haben muss (Sie müssen eine rekursive Template-Funktion schreiben). Können Sie einige Beispiele dafür geben, wie Sie die einzufügenden Werte darstellen? – Mankarse
Ich gehe davon aus, dass die Werte, die eingefügt werden, in den richtigen Typ umgewandelt werden. Aus Gründen der Argumentation können Sie sich vorstellen, dass 'blah' ein' int' ist. – arlogb
Sie werden nicht zu _runtime_ bestimmt, sie werden zu _compile-time_ bestimmt. –