Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CRTP和过载返回类型扣除_C++_Templates_C++11_Metaprogramming_Decltype - Fatal编程技术网

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(…)
可以工作。