gpt4 book ai didi

c++ - 具有基于 protected 基类方法的返回类型的函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:20 25 4
gpt4 key购买 nike

我试图让 doSomeMethod() 的返回类型与 operator() 相同在基类中,但如果它被声明为 protected ,编译器将拒绝带有 error: no type named 'type' in 'std::result_of' 的代码.如果它是公开的,它就可以工作,但我想知道从那以后我是否也可以让它为 protected 案例工作。

这是重现错误的简单代码。

#include <type_traits>

class base
{
protected:
int operator()(){return 1;};
};

class child : private base
{
auto static doSomeMethod()
-> typename std::result_of<base()>::type
{
return 1;
}
};

编辑:

好的,感谢 Kerrek SB 和 Dietmar Kühlr 提供的解决方案和解释。在试用它之后,我发现这个解决方案更具可读性并且更有效(至少在我的实际情况下,child 是模板类,base 是它的模板参数之一)更可靠。但它似乎有点违背你的解释。还是就是这样std::result_of<>在这种情况下坏了吗?

#include <type_traits>

class base
{
protected:
double operator()(){ return 1; };
int operator()(int i){ return i; };
};

class child : private base
{
public:
auto operator()()
-> decltype(base::operator()())
{
return base::operator()();
}

auto operator()(int i)
-> decltype(base::operator()(std::declval<int>()))
{
return base::operator()(i);
}
};

感谢您的宝贵时间。

最佳答案

如果您的代码确实是这样,那么您可以利用以下事实:base 中 protected operator()child 中也可用,并使用一个简单的特征:

template <typename> struct memfn_result;

template <typename C, typename R, typename ...Args>
struct memfn_result<R (C::*)(Args...)>
{
using type = R;
};

class base
{
protected:
int operator()(){ return 1; };
};

class child : private base
{
memfn_result<decltype(&child::operator())>::type a; // "a" is an "int"
};

关于c++ - 具有基于 protected 基类方法的返回类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20894427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com