CRTP和过载返回类型推导

CRTP and overload return type deduction

本文关键字:返回类型 CRTP      更新时间:2023-10-16

考虑以下代码:

template <class Crtp>
struct Base
{
    const float& get(const short int i) const {return std::get<0>(tuple);}
    const double& get(const int i) const {return std::get<1>(tuple);}
    const long double& get(const unsigned long long int i) const {return std::get<2>(tuple);}
    std::tuple<float, double, long double> tuple;
};
struct Derived
: public Base<Derived>
{
    template <class... Misc, class Return = /*SOMETHING*/>
    const Return& test(Misc&&... misc) const
    {return this->get(std::forward<Misc>(misc)...);} 
};

这是一个示例代码:它没有说明有用的东西,例如,可以使用auto函数声明来解决问题。我知道这一点,并且我不会搜索关于这个特定示例的变通方法。

我的问题是:/*SOMETHING*/是什么,才能根据传递的Misc类型获得get的正确重载的返回类型?

只需将decltypestd::declval(来自<type_traits>)一起使用即可:

class Return = decltype(std::declval<Derived const>().get(std::declval<Misc>()...))