を演算子オーバーロードを有効にするには、次のコードスニペットを考えてみてください:条件付き
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>)>;
};
}
どのように私は条件付きでvectory_binary_operation
ためoperator[](size_type i)
を有効にすることができますか? m_e1
IFFアイデアm_e1
とm_e2
IFF
m_op(m_e1[i], m_e2[i])
は両方vector_expression
のです...返すことですm_op(m_e1, m_e2[i])
はm_e2
場合に限っvector_expressionm_op(m_e1[i], 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>
(など)を使用しようとしました。しかし、コンパイラのエラーメッセージは、 'std :: enable_if'に 'type'という名前の型はありません。 'enable_if'を使用してこの宣言を無効にすることはできません。関数や演算子の
フル関連するコードを入力してください。 – SergeyA
'class F1 = E1、class F2 = E2'を使うと、一貫性があり、' F1'と 'F2'を' enable_if'引数として使用します。 –
@SergeyA関連するコードは正確にリンクされた質問のコードでした。私はそれを参照する方が良いと思った(誰も私が何も変えなかったことを誰もが分かるように)。しかし、一部の人々はこの質問を控えめにしていたので、私は質問を編集し、この問題にコードをコピーしました。 – 0xbadf00d