2016-04-11 49 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>)>; 
    }; 
} 

どのように私は条件付きでvectory_binary_operationためoperator[](size_type i)を有効にすることができますか? m_e1 IFFアイデアm_e1m_e2 IFF

  • m_op(m_e1[i], m_e2[i])は両方vector_expressionのです...返すことです
  • m_op(m_e1, m_e2[i])m_e2場合に限っvector_expression
  • m_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'を使用してこの宣言を無効にすることはできません。関数や演算子の

+2

フル関連するコードを入力してください。 – SergeyA

+1

'class F1 = E1、class 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

'std :: enable_if_t * = nullptr'が動作しているのに対し、' class = std :: enable_if_t 'が動作しない理由を教えてください。 – 0xbadf00d

+2

@ 0xbadf00dあなたはおそらく[このシナリオ](http://stackoverflow.com/a/36500292/3953764) –

+0

@ 0xbadf00dとPiotrが言ったように、Yakkは上のリンクでそれをきれいに説明します。 –