2017-08-31 1 views
1

Ich habe eine Vorlage, um mehrere Sensoren zu verarbeiten. Einer sendet mir eine Höheneigenschaft, die anderen nicht. Ich brauche diesen Wert einmal in meinem Code, der Rest der Visualize() Funktion ist für jeden Sensor gleich. Also ich wollte überprüfen, ob T is_same mit FrontCameraSegment und dann wollte ich die segment.height -Eigenschaft einmal verwenden. Der Compiler sagt jedoch, dass "height" kein Mitglied aller Elemente ist, die an T übergeben werden, was logisch ist. Casts funktionieren nicht aus dem gleichen Grund. Die Umstrukturierung der Sensoren mittels Vererbung ist nicht möglich (ich darf diesen Teil nicht machen).C++ setze Wert, wenn Element existiert

Also meine Frage: Wie kann ich dem Compiler sagen, dass ich überprüft habe, dass height ein Mitglied ist?

+1

Mögliches Duplikat von ["constexpr if" vs. ] (https://stackoverflow.com/questions/40972666/constexpr-if-vs-if-with-optimizations-why-is-constexpr-needed) – LogicStuff

+0

Sie müssen Spezialisierungen für Ihre Vorlage basierend auf dem Ergebnis von 'std bereitstellen :: is_same :: value' – user0042

+0

@LogicStuff Danke, dass Sie auf die richtige Antwort zeigen. Aber ich stimme nicht zu, dass dies ein Duplikat ist. Duplizieren bedeutet doppelte Frage, in diesem Fall ist es nur die gleiche Antwort auf zwei verschiedene Fragen. Bitte beachten Sie auch https://meta.stackoverflow.com/a/266246/1023911 und https://meta.stackoverflow.com/q/292329/1023911. –

Antwort

1

In C++ 17, könnten Sie constexpr wenn:

template<typename T> 
void foo(T& segment) 
{ 
    if constexpr (std::is_same<T, FrontCameraSegment>::value) { 
     height = segment.height; 
    } 
    // ... 
} 

, Sie vor dem muss eine Spezialisierung/Dispatching verwenden:

0

verwenden ein enable-if-Stil Funktors die Höhe optional gelten, zum Beispiel:

#include <utility> 
#include <iostream> 

namespace notstd { 
    template<typename... Ts> struct make_void { typedef void type;}; 
    template<typename... Ts> using void_t = typename make_void<Ts...>::type; 
} 
struct Sensor1 
{ 
    int width; 
}; 

struct Sensor2 
{ 
    int width; 
    int height; 
}; 

template<class Sensor, typename = void> 
struct height_reader 
{ 
    template<class SensorArg> 
    void operator()(SensorArg&& source, int& target) const 
    { 
     // no-op 
    } 
}; 

template<class Sensor> 
struct height_reader<Sensor, 
    notstd::void_t<decltype(std::declval<Sensor>().height)>> 
{ 
    template<class SensorArg> 
    void operator()(SensorArg&& source, int& target) const 
    { 
     target = source.height; 
    } 
}; 


struct Readings 
{ 
    int width = 0, height = 0; 
    template<class Sensor> void apply_sensor(Sensor&& sensor) 
    { 
     width = sensor.width; 
     height_reader<Sensor> hr; 
     hr(sensor, height); 
    } 

}; 

void emit(int i) 
{ 
    std::cout << i << std::endl; 
} 

int main() 
{ 
    Sensor1 s1 { 1 }; 
    Sensor2 s2 { 2, 3 }; 

    Readings r; 
    r.apply_sensor(s1); 
    r.apply_sensor(s2); 
    emit(r.height); 
} 
Verwandte Themen