2010-06-20 5 views
10

Est-ce possible?Initialiser et renvoyer une structure en une ligne en C++

Je sais que vous pouvez initialiser des structures en utilisant une syntaxe de liste.

IE

struct Foo f = { a, b, c}; 
return f; 

est possible de le faire en une ligne comme vous le feriez avec des classes et des constructeurs?

Merci

+1

Si une réponse a été utile, merci de l'accepter. Sinon, faites-nous savoir si vous avez une autre question. –

Répondre

14

Créer un constructeur pour la struct (comme une classe) et il suffit de faire

return Foo(a,b,c); 

Modifier: juste pour clarifier: struct en C++ sont comme des classes avec la différence mineure que leur permission d'accès par défaut est publique (et non privée comme dans une classe). Par conséquent, vous pouvez créer un constructeur très simplement, comme:

struct Foo { 
    int a; 
    Foo(int value) : a(value) {} 
}; 
21

Si vous voulez que votre struct reste un POD, utilisez une fonction qui crée:

Foo make_foo(int a, int b, int c) { 
    Foo f = { a, b, c }; 
    return f; 
} 

Foo test() { 
    return make_foo(1, 2, 3); 
} 

Avec C++ 0x uniform initialization supprime la besoin pour cette fonction:

Foo test() { 
    return Foo{1, 2, 3}; 
    // or just: 
    return {1, 2, 3}; 
} 
+6

En C++ 0x, vous pouvez même 'return {1,2,3};' – Cubbi

+2

@Cubbi: Bon, bon point - même si je pense que je vais préférer la version explicite pour éviter les pièges de maintenance lorsque nous commencerons à utiliser les nouvelles fonctionnalités de production. –

+2

Je pense que ce dernier pourrait être très pratique si le type de retour lui-même est compliqué: 'tuple test() {return/* tuple */{x, y, z};}'. (Je suppose que parfois le type de résultat pourrait même être incroyablement compliqué, peut-être même déterminé à l'aide de 'decltype' et autres, auquel cas il serait bien de ne pas répéter la déduction :)) – UncleBens

Questions connexes