2015-03-05 3 views
0

J'ai un code que j'ai pris d'une autre source. Le reste du code fonctionne très bien. Je suis en train d'ajouter à un tuple en utilisant le code suivant:Enregistrement des résultats d'un tuple_cat

// Because std::make_tuple can't be passed 
// to higher order functions. 
constexpr struct MakeTuple 
{ 
    template< class ...X > 
    constexpr std::tuple<X...> operator() (X ...x) { 
     return std::tuple<X...>(std::move(x)...); 
    } 
} tuple{}; 

constexpr struct PushFront 
{ 
    template< class ...X, class Y > 
    constexpr auto operator() (std::tuple<X...> t, Y y) 
     -> std::tuple< Y, X... > 
    { 
     return std::tuple_cat(tuple(std::move(y)), std::move(t)); 
    } 
} pushFront{}; 

template <template <typename...> class T, typename... Args, typename... Obs> 
T<Obs...> MakeSubject(std::tuple<Obs ...> &&obs, Args&& ... args) 
{ 
    return T<Obs...>(std::move(obs), args...); 
} 

template <template <typename...> class T, typename... Args, typename... Obs> 
std::tuple<T<Obs...>> Store(std::tuple<Obs ...> &&obs, Args&& ... args) 
{ 
    return std::make_tuple(T<Obs...>(std::move(obs), args...)); 
} 

template <typename Base> class Observer 
{ 
} 

class Printer : public Observer<Printer> 
{ 
} 

template <typename T, typename... Obs> class Subject 
{ 
private: 
    std::tuple<Obs &...> observers; 
} 

template <typename... Obs> 
class Pressure : public Subject<Pressure<Obs...>, Obs...> 
{ 
} 

std::ostream& operator << (std::ostream& out, const Printer& ac) 
{ 
    //stuff 

    return out; 
} 

J'ai le code en dehors d'une boucle comme ceci:

const Printer sentinel; 
auto store = Store<Pressure>(std::move(std::tuple<Printer>(sentinel)), fakePressure); // The first one is just a delimiter 

Le problème est que dans une boucle, lorsque je tente de joindre à magasin tuples en disant:

while(true) // A Demo loop 
{ 
    auto subject = MakeSubject<Pressure>(std::move(obs), q); 
    pushFront(store, subject.Observers())); 
    std::cout << store; // Always empty 
    std::cout << pushFront(store, subject.Observers()); // This works and shows whatever I passed in, but the list of tuples doesn't grow from previous appends. 
} 

magasin ne pousse pas en ajoutant de plus en plus std :: tuples. Je m'attends à ce que la sémantique de pushFront pour les tuples soit similaire à push_back pour std :: vector etc.

Des suggestions?

Répondre

1

PushFront::operator() renvoie un nouveau tuple avec l'élément ajouté suivi des éléments dans un tuple donné. Il n'ajoute pas à celui transmis.

Il est impossible de pousser dans l'existant, car un tuple de N+1 éléments est un autre type de C++ d'un tuple de N éléments.