2016-04-11 3 views
-1

Пожалуйста, обратите внимание на следующий фрагмент кода:Условно позволяют оператору перегружать

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>)>; 
    }; 
} 

Как можно условно включить в operator[](size_type i) для vectory_binary_operation? Идея заключается в том, чтобы вернуться ...

  • m_op(m_e1[i], m_e2[i]) тогда и только тогда m_e1 и m_e2 оба vector_expression s
  • m_op(m_e1, m_e2[i])m_e1 тогда и только тогда не vector_expression
  • m_op(m_e1[i], m_e2) тогда и только тогда m_e2 не является vector_expression

Как Я могу это сделать? Я пытался обработать оператора как template<class F1 = E1, class F2 = E2> и использовать std::enable_if_t<is_vector_expression_v<F1> && is_vector_expression_v<F2> (и так далее). Но это дает сообщение об ошибке компилятора типа 'type' в 'std :: enable_if'; 'enable_if' не может использоваться для отключения этого объявления.

+2

Просьба предоставить полный соответствующий код. – SergeyA

+1

Если вы используете 'class F1 = E1, класс F2 = E2', то будете согласованы и используйте' F1' и 'F2' как аргументы' enable_if' –

+0

@SergeyA Соответствующий код был точно кодом в связанном вопросе. Я подумал, что было бы лучше обратиться к нему (чтобы все могли видеть, что я ничего не изменил). Однако, поскольку некоторые люди отказались от этого вопроса, я отредактировал этот вопрос и скопировал код на этот вопрос. – 0xbadf00d

ответ

1

на функции или оператора, используйте enable_if таким образом:

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

Не могли бы вы объяснить, почему 'class = std :: enable_if_t' не работает, а 'std :: enable_if_t * = nullptr' работает? – 0xbadf00d

+2

@ 0xbadf00d вы, вероятно, попали [этот сценарий] (http://stackoverflow.com/a/36500292/3953764) –

+0

@ 0xbadf00d, как говорит Петр, Якк прекрасно объясняет это в ссылке выше. –

Смежные вопросы