Detrazione dell'argomento del modello
-
29-10-2019 - |
Domanda
Attualmente sto affrontando un problema che non sono stato in grado di risolvermi. Fondamentalmente quello che sto cercando di fare è implementare un comportamento simile a LinQ in C ++.
Inizierò con il codice nella mia intestazione:
template<typename T, template<class = T> class A,
template<class = T, template<class=T> class = A> class C>
class queryable
{
public:
typedef T value_type;
typedef A<value_type> allocator_type;
typedef C<value_type, allocator_type> container_type; // (1)
typedef queryable<T, A, C> type;
queryable(container_type const &) { }
template<typename _Out> queryable<_Out, A, C> select(/* some delegate */);
// more methods etc
}
Ed è così che vorrei che fosse istanziato:
std::vector<int> my_vec;
queryable<std::vector<int> > q(my_vec);
Inutile dire che questo non funziona (altrui non sarei qui :))
Ora la parte ancora più strana è che anche questo non sembra funzionare:
std::vector<int> my_vec;
queryable<int, std::allocator, std::vector> q(my_vec);
Come puoi vedere (guardando la funzione selezionata), è importante per me non solo usare qualcosa del genere:
template<typename T> class queryable;
Qualche suggerimento su come risolverlo? Ed è anche possibile?
Qualsiasi aiuto sarebbe apprezzato!
EDIT: gli errori che sto ricevendo:
../entry.cpp:19:58: error: type/value mismatch at argument 3 in template parameter list for ‘template<class T, template<class> class A, template<class, template<class> class<template-parameter-2-2> > class C> class failproof::collections::queryable’
../entry.cpp:19:58: error: expected a template of type ‘template<class, template<class> class<template-parameter-2-2> > class C’, got ‘template<class _Tp, class _Alloc> class std::vector’
../entry.cpp:19:61: error: invalid type in declaration before ‘;’ token
EDIT 2:
Per quanto ho capito, il compilatore si lamenta del fatto che C non assume 2 argomenti di classe, ma 1 argomento di classe e 1 argomento di classe modellato (1), perché ho definito C come così. C'è un modo per risolvere questo problema?
Nessuna soluzione corretta