【发布时间】:2016-02-26 23:48:45
【问题描述】:
请考虑以下代码sn-p:
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
vector_expression<E> 的参数i 的类型应该等于E::size_type。出于合理的原因,typename E::size_type 在这里不起作用。出于同样的原因,std::result_of_t<decltype(&size)(vector_expression)> 在这里不起作用。
那么,如果我们能做到,我们该怎么做呢?
【问题讨论】:
-
您的示例在 operator[] 调用中有无限递归。
-
@SimonKraemer 是的,我知道。我已经简化了代码,以便专注于相关部分。但是,为了避免混淆,我已经编辑了代码。
标签: c++ templates c++14 crtp expression-templates