Należy użyć parametrów szablonu szablon:
template<typename T, template <typename, typename> class Container>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class MyMultibyteString
{
Container<T, std::allocator<T>> buffer;
// ...
};
Pozwoliłoby to napisać:
MyMultibyteString<int, std::vector> mbs;
Oto kompilacja live example. Alternatywnym sposobem pisania powyżej mogą być:
template<typename T,
template <typename, typename = std::allocator<T>> class Container>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class MyMultibyteString
{
Container<T> buffer; // <== No more need to specify the second argument here
// ...
};
I tu jest odpowiedni live example.
Należy zwrócić uwagę na to, że liczba i typ argumentów w deklaracji parametru szablonu szablonu musi dokładnie odpowiadać liczbie i typowi argumentów w definicji odpowiedniego szablonu klasy, który ma zostać przekazany jako argument szablonu, niezależnie od faktu, że niektóre z tych parametrów mogą mieć wartości domyślne.
Na przykład: the class template std::vector
accepts two template parameters (typ elementu i typ alokatora), chociaż drugi ma domyślną wartość std::allocator<T>
. Z tego powodu nie można napisać:
template<typename T, template <typename> class Container>
// ^^^^^^^^
// Notice: just one template parameter declared!
class MyMultibyteString
{
Container<T> buffer;
// ...
};
// ...
MyMultibyteString<int, std::vector> mbs; // ERROR!
// ^^^^^^^^^^^
// The std::vector class template accepts *two*
// template parameters (even though the second
// one has a default argument)
Oznacza to, że nie będzie w stanie napisać pojedynczą klasę szablonu, który można zaakceptować zarówno std::set
i std::vector
jako parametr szablonu szablonu, ponieważ w odróżnieniu od std::vector
, the std::set
class template accepts three template parameters.
Co za wspaniały, dokładne odpowiedzi. –
@ScottJones: Cieszę się, że znalazłeś przydatne :) –
@ScottJones Odnosząc się do twojego oświadczenia: 'Oznacza to, że nie będziesz w stanie napisać jednego szablonu klasy, który może zaakceptować zarówno std :: set, jak i std :: vector': szablony variadyczne rozwiązują problem? http://stackoverflow.com/a/20499809/2436175 – Antonio