2016-06-14 15 views

Antwort

7

Sie eine variadische Vorlage Konstruktor bieten könnte wie folgt:

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 er folgende Version funktioniert auch auf 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

Das ist meiner Meinung nach die bessere Antwort. – Boiethios

0

Definieren Sie einfach einen Konstruktor wie folgt aus:

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

Beispiel:

#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"; 
} 

Das ist nicht ein Aggregat Initialisierung ist, aber es ist ein "als ob" ...

1

EDIT : Wie andere in Kommentaren darauf hingewiesen haben, funktioniert dies nicht für , da std::array keinen Konstruktor enthält, der initializer_list übernimmt. Aber es könnte nützlich sein für andere Container, die Konstruktor haben initializer_list, zum Beispiel std::vector.

können Sie verwenden Konstruktor vererben (seit C++ 11):

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

Was? Dies ist nicht einmal gültig C++ ... – DeiDei

+0

Es funktioniert nicht in VS2015. Nicht sicher andere Compiler. – user1899020

+0

Es ist Delegierter Konstrukteurs – user1899020