Пожалуйста, обратите внимание на следующий фрагмент кода:Условно позволяют оператору перегружать
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
sm_op(m_e1, m_e2[i])
m_e1
тогда и только тогда не vector_expressionm_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' не может использоваться для отключения этого объявления.
Просьба предоставить полный соответствующий код. – SergeyA
Если вы используете 'class F1 = E1, класс F2 = E2', то будете согласованы и используйте' F1' и 'F2' как аргументы' enable_if' –
@SergeyA Соответствующий код был точно кодом в связанном вопросе. Я подумал, что было бы лучше обратиться к нему (чтобы все могли видеть, что я ничего не изменил). Однако, поскольку некоторые люди отказались от этого вопроса, я отредактировал этот вопрос и скопировал код на этот вопрос. – 0xbadf00d