gpt4 book ai didi

c++ - 在奇怪的重复模板类中使用方法的返回类型作为另一个方法的参数类型

转载 作者:行者123 更新时间:2023-11-30 03:44:11 24 4
gpt4 key购买 nike

请考虑以下代码片段:

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

参数的类型 ivector_expression<E>应该等于 E::size_type .出于合理的原因,typename E::size_type在这里不起作用。出于同样的原因,std::result_of_t<decltype(&size)(vector_expression)>在这里不起作用。

那么,如果我们能做到,我们该怎么做呢?

最佳答案

您可以将它显式地作为模板参数传递给 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];
}

关于c++ - 在奇怪的重复模板类中使用方法的返回类型作为另一个方法的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com