2017-05-18 3 views
0

Ich habe einen Anwendungsfall für die std::placeholder in einer Testanwendung, aber ich frage mich, ob in einem Bestreben, Dinge auf einer API-Seite ein wenig sauberer aussehen, gibt es eine Möglichkeit, using zu biegen, typedef oder sogar #define, um den Namespace auf Kopfebene zu aliasieren.Verwendung von/Typedef von Namespace in Header

// .../datarequestprocessor.h 
class DataRequestProcessor { 
public: 
    using ProcessFunction = std::function<void(const ResultData &)>; 
    using RequestResultHandle = std::placeholders; // No go. Same with ::_1 
    ... 
}; 

// ../datarequestprocessor.cpp 
ProcessFunction DataRequestProcessor::prepOne() 
{ 
    auto func = std::bind(&DataModel::setData, 
          m_model, 
          RequestResultHandle::_1); 
    return func; 
} 
... // For other variations. 

Dies ist rein semantische und auch nur ein Versuch, über die Natur des using Schlüsselwort zu lernen. Mehr von einer Lernerfahrung als eine reale Anwendung.

Prost

+0

Sie können einen Namespace alias tun ('std :: placeholder' ist ein Namensraum, kein Typ), aber es hat im Namensraum oder Funktionsumfang sein:' Namespace RequestResultHandle = std :: placeholder') – Justin

+0

„No go "ist keine akzeptable Problemaussage. –

+0

Das hat nichts mit 'std :: placeholders' (oder' std :: placeholder', das nicht existiert), was du herausgefunden hättest, wenn du herumgespielt hättest und herausgefunden hättest, dass es bei diesem Problem darum geht Sie verwenden Namespace-Aliase (die nicht im Klassenbereich sein können). –

Antwort

2

Wenn Sie es auf der Ebene Header wollen, dann ist es einfach eine Frage der einen Namespace Alias ​​Einführung:

namespace RequestResultHandle = std::placeholders; 

Die oben genannten werden jedoch nicht innerhalb einer Klasse akzeptiert.

+0

Es gibt keine solche Ding als 'std :: Platzhalter'. –

+0

@BoundaryImposition - Gee, missbilligen Sie mich ein falsches 's' warum nicht – StoryTeller

+0

Befehl bestätigt. –

2

in dem Bemühen, die Dinge ein wenig Reinigungsmittel auf einer API Seite

gar

Idealerweise sollten Sie nicht aussetzen Platzhalter in der API aussehen. Wenn Sie dies tun, haben Sie es oben in Ihrem Code nicht gezeigt.

Wenn Sie nur Platzhalter bei der Umsetzung unter Verwendung der folgenden den Trick:

ProcessFunction DataRequestProcessor::prepOne() 
{ 
    using namespace std::placeholders; 
    auto func = std::bind(&DataModel::setData, 
          m_model, 
          _1); 
    return func; 
} 
+0

Direkt an. Ja, API Level ist wahrscheinlich nicht das Beste für irgendetwas davon. Es sollte für mehr interne Arbeit zwischen den Kohorten abgewinkelt werden. Danke für die Eingabe! Ich hatte nur gehofft, dass das Ergebnis, das variierenden Willen auf der Modell 'setData' -Funktion basiert, ein 'hübsches' Wort anstelle von' std :: Platzhaltern verwenden könnte, wo immer wir eine 'bind' anwenden müssen – mccatnm

0

Sie können die using Direktive nicht zum Aliasnamen namespace verwenden.

Wenn Sie motiviert sind, können Sie Ihre eigenen namespace definieren, in denen Sie bestimmte Typen aus einem anderen Namespace Aliasnamen können.

namespace RequestResultHandle 
{ 
    using _1 = std::placeholders::_1; 
    using _2 = std::placeholders::_2; 

    ... 
} 

Jetzt können Sie RequestResultHandle::_1 statt std::placeholders::_1 verwenden.

+0

_ "Sie können die using-Direktive nicht verwenden, um einen Namespace zu aliasieren." _ Nein, aber mit einem trivialen Tweak (sagen 'namespace' anstelle von' union') [Sie können tun genau das] (http://coliru.stacked-crooked.com/a/cba14ca09ae0381d), ohne jedes Namespace-Mitglied der Reihe nach benennen zu müssen. –

+0

@BoundaryImposition, Hast du einfach 'union' anstelle von' using' gesagt?Du verlierst deine Berührung :) –

+0

Es ist spät haha: D –

Verwandte Themen