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或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或CIN > Obj.StValue是<>强>无效C++。无法获取
类的特定实例的成员函数的引用/指针

您可以做的是将
这个
指针和指向成员函数的指针打包到一个小的
结构
,并在上面重载
操作符>

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> >的成员函数