2016-04-11 16 views
-1

beachten Sie bitte folgende Code-Schnipsel:ermöglichen Bedingtes einen Operator Überlastung

template<class E> 
class vector_expression {}; 

template<class Tuple> 
class vector 
    : public vector_expression<vector<Tuple>> 
{ 
public: 
    using value_type = typename Tuple::value_type; 
    using size_type = typename Tuple::size_type; 
}; 

namespace detail 
{ 
    template<class E> 
    constexpr bool is_vector_expression_v = std::is_base_of_v<vector_expression<std::decay_t<E>>, std::decay_t<E>>; 

    template<class E, class = void> 
    struct value_type { using type = std::decay_t<E>; }; 
    template<class E> 
    struct value_type<E, std::enable_if_t<is_vector_expression_v<E>>> { using type = typename std::decay_t<E>::value_type; }; 

    template<class E> 
    using value_type_t = typename value_type<E>::type; 

    template<class E1, class E2, class BinaryOperation> 
    class vector_binary_operation 
    { 
    public: 
     using value_type = std::result_of_t<BinaryOperation(value_type_t<E1>, value_type_t<E2>)>; 
    }; 
} 

Wie kann ich bedingt eine operator[](size_type i) für vectory_binary_operation aktivieren? Die Idee ist, zurückzukehren ...

  • m_op(m_e1[i], m_e2[i]) iff m_e1 und m_e2 sind beide vector_expression s
  • m_op(m_e1, m_e2[i]) iff m_e1 ist kein vector_expression
  • m_op(m_e1[i], m_e2) iff m_e2 ist kein vector_expression

Wie kann ich das machen? Ich habe versucht, den Operator als template<class F1 = E1, class F2 = E2> zu behandeln und std::enable_if_t<is_vector_expression_v<F1> && is_vector_expression_v<F2> zu verwenden (und so weiter). Aber das ergibt die Compiler-Fehlermeldung kein Typ namens 'type' in 'std :: enable_if'; 'enable_if' kann nicht verwendet werden, um diese Deklaration zu deaktivieren.

+2

Bitte vollständigen entsprechenden Code zur Verfügung stellen. – SergeyA

+1

Wenn Sie 'Klasse F1 = E1, Klasse F2 = E2' verwenden, dann seien Sie konsistent und verwenden' F1' und 'F2' als' enable_if' Argumente –

+0

@SergeyA Der entsprechende Code war genau der Code in der verknüpften Frage. Ich dachte, es wäre besser, darauf zu verweisen (so dass jeder sehen kann, dass ich nichts geändert habe). Da einige Leute diese Frage jedoch abgelehnt haben, habe ich die Frage bearbeitet und den Code auf diese Frage kopiert. – 0xbadf00d

Antwort

1

auf einer Funktion oder Operator verwendet enable_if diese Weise:

template<class A, class B, 
     std::enable_if_t<condition_test_here<A,B>::value>* = nullptr> 
auto operator+(A, const B&) 
{ 
    ... 
} 
+0

Könnten Sie bitte erklären, warum 'class = std :: enable_if_t' nicht funktioniert, während 'std :: enable_if_t * = nullptr' funktioniert? – 0xbadf00d

+2

@ 0xbadf00d Sie wahrscheinlich getroffen [dieses Szenario] (http://stackoverflow.com/a/36500292/3953764) –

+0

@ 0xbadf00d wie Piotr sagt, Yakk erklärt es schön in den Link oben. –

Verwandte Themen