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])
iffm_e1
undm_e2
sind beidevector_expression
sm_op(m_e1, m_e2[i])
iffm_e1
ist kein vector_expressionm_op(m_e1[i], m_e2)
iffm_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.
Bitte vollständigen entsprechenden Code zur Verfügung stellen. – SergeyA
Wenn Sie 'Klasse F1 = E1, Klasse F2 = E2' verwenden, dann seien Sie konsistent und verwenden' F1' und 'F2' als' enable_if' Argumente –
@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