2016-06-16 7 views
2

Ich kann dies derzeit tun:Was ist der effizienteste Weg, die Werte einer Variablenvorlage in einer bestimmten Reihenfolge zu erweitern?

template <std::size_t... Is, class... Ts> 
decltype(auto) custom_expand(std::index_sequence<Is...>, Ts&&... args) 
{ 
    auto tmp_tuple{ std::make_tuple(std::forward<Ts>(args)...) }; 
    return std::make_tuple(std::move(std::get<Is>(tmp_tuple))...); 
} 

Funktion aufrufen ...

custom_expand(std::index_sequence<1, 2, 0>{}, int{ 0 }, char{ 1 }, double{ 2 }); 

... zurück std::tuple<char, double, int> wie erwartet. Dies erfordert jedoch die Konstruktion eines temporären std::tuple<> und alles, was mit diesem Vorgang verbunden ist.

Gibt es einen Weg, der eine temporäre std::tuple<> vermeidet, so dass ich für keine Kopien/Bewegungen bezahlen muss?

+0

* "Dies erfordert jedoch die Erstellung eines temporären std :: tuple <> und alle damit verbundenen Operationen." * - Haben Sie das mit optimierter Optimierung für Ihren Compiler quantifiziert? –

+0

@TonyD Ich habe es nicht getan, danke, dass du das gebracht hast. – user2296177

Antwort

3

Um übermäßige Kopien/Bewegungen zu vermeiden, verwenden Sie forward_as_tuple für die temporäre. Das gibt ein Tupel von Referenzen zurück, die von jedem anständigen Optimierer einfach optimiert werden können.

+0

Oder kurz "Auto". – Barry

+0

@Barry Ja, ich habe gerade den Code von OP eingegeben, wie Sie sich vorstellen können ... –