2016-10-18 4 views
2

ich folgendes Problem:Get Ein-/Ausgabetyp aufrufbar

template<typename Func, typename T_in = /*input type of Func */, typename T_out = /*output type of Func */> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
} 

Wie man oben sehen kann, ich versuche, eine Funktion foo zu implementieren, die eine Funktion bildet f jedes Element eines Eingangsvektors input. Mein Problem ist folgendes: Ich möchte, dass die Elemente des Eingangsvektors input den Eingangstyp f (dh T_in) und die Elemente des Ausgangsvektors den Ausgangstyp f (dh T_out) haben, aber ohne den Eingang/Ausgabetyp f explizit zu foo (wegen einer besseren Lesbarkeit des Codes). Hat jemand eine Idee wie der Ein-/Ausgangstyp von f zur Kompilierzeit automatisch abgeleitet werden kann?

Vielen Dank im Voraus.

Antwort

1

Der Typ T_in kann aus dem input Vektor abgeleitet werden.

Ich denke, dass der Abzug der T_out ist ein Werk für std::result_of_t

template <typename Func, typename T_in, 
      typename T_out = std::result_of_t<Func(T_in)>> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 

Mit typename std::result_of<Func(T_in)>::type statt std::result_of_t<Func(T_in)> sollte auch für C++ 11, nicht nur für C++ 14 arbeiten.

0

Mit einer Karte von Funktionen ist es tatsächlich sehr häufig Entwurfsmuster C++. Ich empfehle Ihnen, dafür den Container std :: Map zu verwenden. here is a link.

viel Glück :)

+0

Vielen Dank. Der Einfachheit halber habe ich in meinem Beitrag oben ein vereinfachtes Beispiel verwendet. Leider kann mein reales Beispiel nicht mit der Standardbibliothek implementiert werden. –

2

decltype würde für diese Arbeit, zusammen mit foo ‚Rückkehr Typ auto ändern.

template<typename Func, typename T_in> 
auto foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<decltype(f(input[0]))> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
}