【问题标题】:CRTP and overload return type deductionCRTP和过载返回类型扣除
【发布时间】:2013-07-02 06:53:34
【问题描述】:

考虑以下代码:

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)...);} 
};

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

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

【问题讨论】:

  • 与推算回报率一样吗?这应该可以正常工作:class Return = decltype(this-&gt;get(std::declval&lt;Misc&gt;()...)).
  • @Xeo:如果我这么说,我可以用Return替换const Return&amp;吗?
  • 如果你想“完美返回”,即准确返回基本函数给你的东西,那么可以。
  • @Xeo: invalid use of ‘this’ at top level,但我认为Deriveddeclval 应该没问题。
  • @Xeo 可能std::declval&lt;const Derived&gt;().get(...) 有效。

标签: c++ templates c++11 metaprogramming decltype


【解决方案1】:

只使用decltypestd::declval(来自&lt;type_traits&gt;)应该没问题:

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

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2020-02-19
    • 2013-03-07
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多