2016-06-14 2 views

Répondre

7

Vous pouvez fournir un constructeur de modèle variadique comme suit:

class A : public std::array<int, 3> { 
public: 
    template<typename... Args> constexpr A(Args&& ...args) 
    : std::array<int, 3>{{std::forward<Args>(args)...}} {} 
}; 

Live Demo

Edit:

T il version suivante fonctionne également sur Visual Studio:

class A : public std::array<int, 3> { 
public: 
    template<typename... Args> constexpr A(Args&& ...args) 
     : std::array<int, 3>(std::array<int,3>{std::forward<Args>(args)...}) {} 
}; 

Live Demo

+0

C'est la meilleure réponse à mon avis. – Boiethios

0

définissent Juste un constructeur comme ça:

A(std::array<int, 3>); 

exemple:

#include <array> 
#include <iostream> 

struct A : public std::array<int, 3> 
{ 
    A(std::array<int, 3> a) : 
     std::array<int, 3>{a} 
    { 
    } 
}; 

int main(void) 
{ 
    A a({1, 2, 3}); 

    std::cout << a[0] << "\n"; 
    std::cout << a[1] << "\n"; 
    std::cout << a[2] << "\n"; 
} 

Ce n'est pas une initialisation globale, mais il est "comme si" ...

1

EDIT : Comme d'autres l'ont souligné dans les commentaires, cela ne fonctionnera pas pour std::array car std::array ne contient pas de constructeur prenant initializer_list. Mais il peut être utile pour d'autres conteneurs dont le constructeur prend initializer_list, par exemple std::vector.

Vous pouvez utiliser constructeur héritant (depuis C de 11):

class A: public std::vector<int,3> 
{ 
     using std::vector<int,3>::vector; 
}; 
+0

Quoi? Ce n'est même pas valide C++ ... – DeiDei

+0

Cela ne fonctionne pas dans VS2015. Pas sûr que d'autres compilateurs. – user1899020

+0

Il est des constructeurs de délégué – user1899020