C++ “我怎么能?”;“自动发送”;bind函数中调用对象的实例?

C++ “我怎么能?”;“自动发送”;bind函数中调用对象的实例?,c++,bind,C++,Bind,: 如果Voice构造函数可以接受两个参数(Osc对象和成员函数指针),您可以这样解决它: class Voice { public: double mVoiceValue = 0.0; std::function<double(double)> mTargetFunction; template<typename T, typename F> Voice(T& targetObject, F&& targetFu

:


如果
Voice
构造函数可以接受两个参数(
Osc
对象和成员函数指针),您可以这样解决它:

class Voice
{
public:
    double mVoiceValue = 0.0;
    std::function<double(double)> mTargetFunction;

    template<typename T, typename F>
    Voice(T& targetObject, F&& targetFunction)
        : mTargetFunction(std::bind(targetFunction, targetObject, std::ref(*this), std::placeholders::_1)) { }
    ~Voice() { }
};

class Osc
{
public:
    double mOscValue = 1.0;

    Osc() { }
    ~Osc() { }

    double Modulate(Voice &voice, double value) {
        return mOscValue * voice.mVoiceValue * value;
    }
};

...

Osc   osc;
Voice voice1(osc, &Osc::Modulate);
Voice voice2(osc, &Osc::Modulate);

voice1.mVoiceValue = 1.0;
voice2.mVoiceValue = 2.0;
std::cout << "value: " << voice1.mTargetFunction(10.0) << std::endl;
std::cout << "value: " << voice2.mTargetFunction(100.0) << std::endl;
班级语音
{
公众:
双mVoiceValue=0.0;
std::function-mTargetFunction;
模板
语音(T&targetObject、F&targetFunction)
:mTargetFunction(std::bind(targetFunction,targetObject,std::ref(*this),std::占位符::1)){}
~Voice(){}
};
类Osc
{
公众:
双MOSC值=1.0;
Osc(){}
~Osc(){}
双调制(语音和语音,双值){
返回mOscValue*voice.mVoiceValue*值;
}
};
...
Osc Osc;
语音1(osc和osc::调制);
语音2(osc和osc::调制);
voice1.mVoiceValue=1.0;
voice2.mVoiceValue=2.0;

std::不能在
语音上提供调用
mTargetFunction(*this,随便什么)的方法。然后像
voice1.callTarget(10.0)那样调用它
请注意,当您绑定时,您将创建两个
osc
对象的副本。@Slava:“您创建两个osc副本”是什么意思?@paizza,当您将调用
osc::Modulate
时,将通过将在osc副本上调用的绑定对象。例如,如果该方法将对对象本身进行更改,而该更改在
osc
或传递到第二个绑定的对象中不可见。通过值传递
osc
。查看答案以及为什么使用
std::ref
。哦,是的,当然!我的打字错误。在我的真实代码中,我有
Osc*Osc=newosc()
与sharm一样工作,没有
std::ref
;)多亏了找出它,我才编辑了这个问题。我不想使用模板。@paizza,除非你总是使用
Osc
,否则你真的没有选择:要么是你的解决方案,要么是我的带模板的解决方案。当然,您将只使用
Osc
对象,然后进行转发声明并对其使用进行硬编码。(可选)创建多个
Voice
构造函数的重载,每个重载为您可能使用的每个对象获取一个指向成员函数的指针。“您将始终使用Osc”是什么意思?我想对每个语音使用
Osc
Osc::Modulate
功能。Slave说“请注意,绑定时要复制2份osc对象。”不确定他的意思。也许它是相关的?难道
F&&targetFunction
不是一个通用的参考吗?如果是,那么它不应该是std::forward ed to std::bind吗?@paizza我的意思是,你会使用其他类或成员函数吗?它是否总是
Osc
Osc::Modulate
?然后你必须使用像我这样的解决方案,或者你已经有的解决方案。另一方面,如果您总是使用
Osc::Modulate
,则根本不需要绑定和所有这些。
std::cout << "value: " << voice1.mTargetFunction(10.0) << std::endl;
std::cout << "value: " << voice2.mTargetFunction(100.0) << std::endl;
class Voice
{
public:
    double mVoiceValue = 0.0;
    std::function<double(double)> mTargetFunction;

    template<typename T, typename F>
    Voice(T& targetObject, F&& targetFunction)
        : mTargetFunction(std::bind(targetFunction, targetObject, std::ref(*this), std::placeholders::_1)) { }
    ~Voice() { }
};

class Osc
{
public:
    double mOscValue = 1.0;

    Osc() { }
    ~Osc() { }

    double Modulate(Voice &voice, double value) {
        return mOscValue * voice.mVoiceValue * value;
    }
};

...

Osc   osc;
Voice voice1(osc, &Osc::Modulate);
Voice voice2(osc, &Osc::Modulate);

voice1.mVoiceValue = 1.0;
voice2.mVoiceValue = 2.0;
std::cout << "value: " << voice1.mTargetFunction(10.0) << std::endl;
std::cout << "value: " << voice2.mTargetFunction(100.0) << std::endl;