C++ CRTP和过载返回类型扣除
考虑以下代码:C++ CRTP和过载返回类型扣除,c++,templates,c++11,metaprogramming,decltype,C++,Templates,C++11,Metaprogramming,Decltype,考虑以下代码: 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(cons
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)...);}
};
模板
结构基
{
const float&get(const short int i)const{return std::get(tuple);}
constdouble&get(constinti)const{returnstd::get(tuple);}
const long double&get(const unsigned long long int i)const{return std::get(tuple);}
std::tuple;
};
结构派生
:公共基地
{
模板
常量返回和测试(杂项和…杂项)常量
{返回此->获取(std::forward(misc)…);}
};
这是一个示例代码:它没有说明一些有用的东西,例如,可以使用自动函数声明来解决这个问题。我知道这一点,并且我不寻找关于这个特定示例的解决方法
我的问题是:
/*SOMETHING*/
根据传递的Misc
类型获得正确的get
重载的返回类型是什么?仅使用decltype
和std::declval
(来自
)就可以了:
class Return = decltype(std::declval<Derived const>().get(std::declval<Misc>()...))
class Return=decltype(std::declval().get(std::declval()…)
你对推断回报率也会这么做吗?这应该可以正常工作:class Return=decltype(This->get(std::declval()…)
@Xeo:如果我这么说,我可以用Return
替换const Return&
吗?如果你想“完美返回”,也就是说,完全返回基函数给你的值,那么是的。@Xeo:在顶层无效地使用了“This”
,但是我认为declval
的Derived
应该可以。@Xeo可能std::declval().get(…)
可以工作。