2016-05-11 7 views
0

Ich habe eine Anforderung, wo ich Variable Template-Parameter an eine Funktion übergeben haben. Natürlich wird es verschiedene Implementierungen der Funktion geben, abhängig vom Template-Parameter. Ich muss Manipulatoren als Template-Parameter identifizieren.Wie Manipulator als Vorlage Parameter und aktivieren Funktionsaufruf für bestimmte

Ich habe versucht mit std::enable_if<std::is_same<decltype(/*some specific manipulator*/), T>::value>. Aber ein Problem mit diesem Ansatz ist, dass einige Manipulatoren nicht dazu passen. Könnte mir jemand eine bessere Lösung vorschlagen als die erwähnte? Außerdem haben nicht alle Manipulatoren dieselbe Signatur und ihre Rückgabetypen werden zur Kompilierzeit definiert.

Manipulators

+0

"einige Manipulator nicht passt dies zu." was bedeutet das? Kannst du is_base_of anstelle von is_same benutzen? – xaxxon

+0

@ xaxxon für z.B. setprecision hat einen nicht spezifizierten Rückgabetyp. Also kann ich nicht mit is_same vergleichen. Ich bin mir nicht sicher über is_base_of. – AAA

+0

Bitte geben Sie ein konkretes Beispiel dafür, was Sie zu tun versuchen. – xaxxon

Antwort

1

Ich bin noch nicht ganz sicher, was Sie zu tun versuchen, aber wenn Sie wollen einfach nur sehen, wenn Sie es zu einem Strom anwenden können, dann vielleicht wird dies tun, was Sie wollen?

#include <iostream> 
#include <ios> 
#include <type_traits> 

using namespace std; 

template<class T> 
using int_t = int; 

template<typename T, int_t<decltype(operator<<(std::declval<istream>(), declval<T>()))> = 0> 
void go(T f){ 
    cout << f << true << false << endl; 
} 

struct foo{}; 

int main() 
{ 

    go(&boolalpha); 
    go(foo()); 

} 

Live: https://godbolt.org/g/rDt4Gu