2 votes

Instanciation de l'objet typename dans le modèle de classe avec n'importe quel ensemble de paramètres.

Prenons l'exemple suivant :

template<typename T>
class A
{
public:
    A(int p1, int p2, //any arguments needed for T constructor);
private:
    std::vector<T> vec;
};

template<typename T>
A<T>::A(int p1, int p2, //any arguments needed for T constructor)
{
    for(size_t i = 0; i < 10; ++i)
    {
        vec.push_back(T(//any arguments needed for T constructor))     
    { 
}

Puis-je créer un modèle de classe qui accepterait un type avec n'importe quelle signature de constructeur ?

4voto

Caleth Points 17517

Oui.

Vous n'avez pas besoin de la boucle, non plus

template<typename T>
class A
{
public:
    template<typename... Args>
    A(Args&&... args) : vec(10, T(std::forward<Args>(args)...)) {}
private:
    std::vector<T> vec;
};

1voto

Steve Lorimer Points 2248

Vous pouvez utiliser un paquet d'arguments de modèle variadique

template<typename T>
class A
{
public:
    template<typename... Args>
    A(Args&&...);
private:
    std::vector<T> vec;
};

template<typename T>
template<typename... Args>
A<T>::A(Args&&... args)
{
    for(size_t i = 0; i < 10; ++i)
    {
        vec.push_back(T(args...));
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X