1

次のコード スニペットを検討してください。

template<class E>
class vector_expression
{
public:
    auto size() const {
        return static_cast<E const&>(*this).size();
    }

    auto operator[](/* type equal to E::size_type */ i) const
    {
        if (i >= size())
            throw std::length_error("");
        return static_cast<E const&>(*this)[i];
    }
}; // class vector_expression

template<typename T, class Tuple = std::vector<T>>
class vector
    : public vector_expression<vector<T, Tuple>>
{
public:
    using value_type = T;
    using size_type = typename Tuple::size_type;

    size_type size() const {
        return m_elements.size();
    }

    value_type operator[](size_type i) const { /* ... */ }

private:
    Tuple m_elements;
}; // class vector

の引数の型はi等しいvector_expression<E>必要がありますE::size_type。もっともらしい理由で、typename E::size_typeここでは機能しません。同じ理由で、std::result_of_t<decltype(&size)(vector_expression)>ここでは機能しません。

では、できるとしたらどうすればよいのでしょうか。

4

1 に答える 1

2

テンプレートパラメータとして明示的に渡すことができますvector_expression

template<class E, class size_type>
class vector_expression ...

template<typename T, class Tuple = std::vector<T>>
class vector
    : public vector_expression<vector<T, Tuple>, 
                               typename Tuple::size_type> ...

編集:

完全なクラス定義が表示されるまでインスタンス化されないように、問題のある関数をメンバー関数テンプレートに変換することもできます。

template <typename K = E>
auto operator[](typename K::size_type i) const
{
    if (i >= size())
        throw std::length_error("");
    return static_cast<K const&>(*this)[i];
}
于 2016-02-27T01:02:04.703 に答える