0
これは私のattempt:私はこれを間違ってバインドしていますか?
#include <iostream>
#include <functional>
class Voice;
class EnvelopeMultiPoints
{
public:
std::function<double(Voice &, double)> mCallback;
void SetupModulation(std::function<double(Voice &, double)> callback, int paramID) {
mCallback = callback;
}
};
class Voice
{
public:
EnvelopeMultiPoints mEnvelopeMultiPoints;
};
class VoiceManager
{
public:
Voice mVoices[16];
inline void UpdateVoices(std::function<void(Voice &)> callback) {
for (int i = 0; i < 16; i++) {
callback(mVoices[i]);
}
}
static void SetupEnvelopeMultiPointsModulation(Voice &voice, std::function<double(Voice &, double)> callback, int paramID) {
voice.mEnvelopeMultiPoints.SetupModulation(callback, paramID);
}
};
class Oscillator
{
public:
double ModulatePitch(Voice &voice, double currentValue) {
// somethings with voice
return currentValue * 10.0;
}
};
int main()
{
VoiceManager voiceManager;
Oscillator *pOscillator = new Oscillator();
int param = 100;
auto callback = std::bind(&Oscillator::ModulatePitch, pOscillator, std::placeholders::_1, std::placeholders::_2);
voiceManager.UpdateVoices(std::bind(&VoiceManager::SetupEnvelopeMultiPointsModulation, std::placeholders::_1, callback, param));
Voice voice = voiceManager.mVoices[0];
std::cout << voice.mEnvelopeMultiPoints.mCallback(voice, 1.0) << std::endl;
delete pOscillator;
}
私は後で機能のいずれかの種類を渡すことができ、ボイスアップデータ「基本」イテレータの並べ替えを作成します。それはすべての声を繰り返し、私はその繰り返しに必要な機能を渡します。
しかし、私はOscillator::ModulatePitch
の機能をアップデータに渡すのに間違っているようですか?
ここで私は間違っていますか?
ラムダの使用は許可されていますか? 'auto callback = [pOscillator](auto&voice、double d){return pOscillator-> ModulatePitch(voice、d);}を使用します。 }; '私のために働く。一般的な経験則は、lambdasを使うことができるときに 'std :: bind'を避けることです。 – Maikel
'std :: bind'をlambdasに置き換えることを考えましたか? – nwp
'callback'に明示的な型を使用すると修正されます。 'std :: functionコールバック= ...' 私は理由を正確には説明できません。 –
pergy