C++ C++;运营商>&燃气轮机;使用变异子重载?
我正在试图找到一种方法(如果可能的话)来重载>>操作符,使其能够正确地使用变异子。例如,我想写:C++ C++;运营商>&燃气轮机;使用变异子重载?,c++,c++11,operator-overloading,member-function-pointers,mutators,C++,C++11,Operator Overloading,Member Function Pointers,Mutators,我正在试图找到一种方法(如果可能的话)来重载>>操作符,使其能够正确地使用变异子。例如,我想写: myClass obj; cin >> obj.setValue; 并在一行中使用可用的mutator正确设置obj的私有值。我知道我可以使用一个临时变量来存储cin并用它设置obj值,但我想知道是否有这样一种更简洁的方法。我是一名新手程序员,因此这是我在myClass中徒劳的尝试: friend std::istream &operator>>(std::istr
myClass obj;
cin >> obj.setValue;
并在一行中使用可用的mutator正确设置obj的私有值。我知道我可以使用一个临时变量来存储cin并用它设置obj值,但我想知道是否有这样一种更简洁的方法。我是一名新手程序员,因此这是我在myClass中徒劳的尝试:
friend std::istream &operator>>(std::istream &in, void (myClass::*pt)(double newValue)) {
double temp;
in >> temp;
pt(temp);
return in;
}
我知道我可以简单地将myClass作为一个整体重载以接受:
cin >> myClass;
但这会阻止我在不同的时间在myClass中设置不同的个人值
<谢谢> <代码> CIN > Obj.StValue或
类的特定实例的成员函数的引用/指针
您可以做的是将这个
指针和指向成员函数的指针打包到一个小的结构
,并在上面重载操作符>
:
template <typename T, typename Arg>
struct setter_t
{
T* _this;
void (T::*_ptr)(Arg);
};
template <typename T, typename Arg>
auto setter(T& x, void (T::*ptr)(Arg))
{
return setter_t<T, Arg>{&x, ptr};
}
template <typename T, typename Arg>
std::istream &operator>>(std::istream &in, setter_t<T, Arg> s)
{
Arg temp;
in >> temp;
(s._this->*s._ptr)(temp);
return in;
}
这里有一个C++17解决方案,它不会在setter\t
中不必要地存储\u ptr
。用法:
std::cin >> setter<&myClass::setValue>(obj);
设置器(obj);
<>代码> CIN > Obj.StValue或
类的特定实例的成员函数的引用/指针
您可以做的是将这个
指针和指向成员函数的指针打包到一个小的结构
,并在上面重载操作符>
:
template <typename T, typename Arg>
struct setter_t
{
T* _this;
void (T::*_ptr)(Arg);
};
template <typename T, typename Arg>
auto setter(T& x, void (T::*ptr)(Arg))
{
return setter_t<T, Arg>{&x, ptr};
}
template <typename T, typename Arg>
std::istream &operator>>(std::istream &in, setter_t<T, Arg> s)
{
Arg temp;
in >> temp;
(s._this->*s._ptr)(temp);
return in;
}
这里有一个C++17解决方案,它不会在setter\t
中不必要地存储\u ptr
。用法:
std::cin >> setter<&myClass::setValue>(obj);
设置器(obj);
您可以使.setValue()返回对函子(重写运算符()的类)的非常量引用,然后使该函子重写
std::istream &operator>>(std::istream &is, MySetterFunctor &x){
double temp;
is >> temp;
x(temp);
return is;
}
functor将由obj初始化,接收指向obj的指针,并在其内部使用实际obj的setter方法
void操作符()(双v){obj->set_值(v);}
对于额外的黑客行为,您可以将setValue设置为非const公共成员,这样您就可以像std::cin>>obj.setValue一样调用它,并且通常也可以执行x.setValue(someDouble)。您可以使obj.set_值成为受保护的成员函数,并使MySetterFunctor成为obj的朋友类
class Obj{
public:
friend class MySetterFunctor;
MySetterFunctor setValue;
...
}
大免责声明:这都是理论上的空谈,我不确定有人会想这么做,但我相信这会让你做你想做的 可以使.setValue()返回对函子(重写运算符()的类)的非常量引用,然后使该函子重写
std::istream &operator>>(std::istream &is, MySetterFunctor &x){
double temp;
is >> temp;
x(temp);
return is;
}
functor将由obj初始化,接收指向obj的指针,并在其内部使用实际obj的setter方法
void操作符()(双v){obj->set_值(v);}
对于额外的黑客行为,您可以将setValue设置为非const公共成员,这样您就可以像std::cin>>obj.setValue一样调用它,并且通常也可以执行x.setValue(someDouble)。您可以使obj.set_值成为受保护的成员函数,并使MySetterFunctor成为obj的朋友类
class Obj{
public:
friend class MySetterFunctor;
MySetterFunctor setValue;
...
}
大免责声明:这都是理论上的空谈,我不确定有人会想这么做,但我相信这会让你做你想做的 欢迎来到堆栈溢出。请花时间阅读并参考您可以在此处询问的内容和方式。
cin>>obj.setValue代码>不能工作——它不是一个有效的C++语法(假设代码> SETValue/CODE >是代码> MyCys<代码>的成员函数。欢迎使用堆栈溢出。请花时间阅读并参考您可以在此处询问的内容和方式。cin>>obj.setValue代码>不能工作-它不是一个有效的C++语法(假设代码> SETValue/CODE >是 MyCype < /C> >的成员函数