Déduction d'argument du modèle
-
29-10-2019 - |
Question
Je suis actuellement confronté à un problème que je n'ai pas pu me résoudre. Fondamentalement, ce que j'essaie de faire, c'est implémenter un comportement de type LINQ en C ++.
Je vais commencer avec le code dans mon en-tête:
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
}
Et c'est ainsi que j'aimerais qu'il soit instancié:
std::vector<int> my_vec;
queryable<std::vector<int> > q(my_vec);
Inutile de dire que cela ne fonctionne pas (autre chose que je ne serais pas ici :))
Maintenant, la partie encore plus étrange est que même cela ne semble pas fonctionner:
std::vector<int> my_vec;
queryable<int, std::allocator, std::vector> q(my_vec);
Comme vous pouvez le voir (en regardant la fonction sélectionnée), il est important pour moi de non seulement utiliser quelque chose comme ceci:
template<typename T> class queryable;
Des suggestions sur la façon de résoudre ce problème? Et est-ce même possible?
Toute aide serait appréciée!
Edit: les erreurs que je reçois:
../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:
Pour autant que je comprends, le compilateur se plaint de C ne prenant pas 2 arguments de classe, mais 1 argument de classe et 1 argument de classe modèle (1), parce que j'ai défini C pour être ainsi. Existe-t-il un moyen de résoudre ce problème?
Pas de solution correcte