2017-11-26 12 views
0

Ich habe den folgenden Code:alias für verschachtelten Vorlagentyp

template <template <typename, typename...> typename trait_t, typename arg_t> 
struct BindFirst 
{ 
    template <typename... arg_ts> 
    using result_t = trait_t<arg_t, arg_ts...>; 
}; 

#define BIND_FIRST(trait_t, arg_t) BindFirst<trait_t, arg_t>::template result_t 

Sie es verwenden können das erste Argument eines Merkmals wie folgt zu binden:

BIND_FIRST(std::is_same, double) 

Das Ergebnis entspricht:

template <typename T> 
struct IsInt : std::is_same<double, T> { }; 

Der Unterschied ist, dass Sie es inline verwenden können. Zum Beispiel so:

using result_t = find_t<type_list, BIND_FIRST(std::is_same, double)>; 

Dies funktioniert, aber ich mag es, die Definition zu vermeiden. Ich habe versucht, einen Alias ​​zu verwenden. Aber ich habe keine Ahnung, wie ich es anwenden soll. Gibt es eine Möglichkeit, die Definition zu ersetzen?

+0

entscheiden wollen, wie Sie beabsichtigen das Makro/alias zu benutzen? ein kleines Beispiel für seine Verwendung wäre nett – vu1p3n0x

+0

Ich habe ein Beispiel –

Antwort

1

Sie können Vorlagen mit using verwenden, um eine Aliasvorlage zu erstellen, genau wie Sie es für result_t getan haben.

template <typename... Args> 
using IsDouble = BindFirst<std::is_same, double>::template result_t<Args...>; 

Sie können T auch die Args... auf einen einzigen Typen begrenzen, muss es nicht variadische sein.

Edit: Wenn Ihr Ziel vorformulierten zu reduzieren ist, können Sie für so etwas wie dieses

template <typename T, typename U> 
using IsSameAs = std::is_same<T, U>; 

template <typename T> 
using IsDouble = IsSameAs<double, T>; 
+1

Nitpicking Terminologie etwas hinzugefügt, aber eine * using-Anweisung * ist die Form 'using namespace X;'. Eine * using-Deklaration * ist etwas wie 'using std :: swap;'. Was Sie meinen, wird als * Alias-Vorlage * bezeichnet. – oisyn

+0

@oisyn ah danke! redigiert – vu1p3n0x

+0

Sie benötigen auch einen 'template' Spezifizierer direkt vor' result_t', weil es ein abhängiger Vorlagenname ist. Ihr zweites Beispiel wird nicht kompiliert, Sie können Alias-Vorlagen nicht so verwenden. Du musst es in eine Struktur einpacken, aber dann ist @Martin Kalbfuß wieder da, wo er angefangen hat. – oisyn