【发布时间】: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->get(std::declval<Misc>()...)). -
@Xeo:如果我这么说,我可以用
Return替换const Return&吗? -
如果你想“完美返回”,即准确返回基本函数给你的东西,那么可以。
-
@Xeo:
invalid use of ‘this’ at top level,但我认为Derived的declval应该没问题。 -
@Xeo 可能
std::declval<const Derived>().get(...)有效。
标签: c++ templates c++11 metaprogramming decltype