非同期のオブザーバーパターンを作成しようとすると、コンパイラエラーC3867が発生します。これを解決する方法がわかりません。サンプルコードスニペットは次のとおりです
class Subject;
class Observer
{
public:
virtual void notify(Subject* s) = 0;
virtual ~Observer() {};
};
class Subject
{
std::map<std::string, Observer *> observers;
protected:
void notify_observers()
{
std::map<std::string, Observer *>::iterator iter;
for (iter = observers.begin(); iter != observers.end(); ++iter) {
void (Observer::*notify)(Subject *) = iter->second->notify;
std::async(std::launch::async, notify, this);
}
}
public:
virtual ~Subject() {};
void observer(std::string id, Observer* o)
{
observers[id] = o;
}
};
template<typename Iter, typename type>
class Sort : public Observer {
public:
virtual void notify(Subject* s)
{
TestSort<Iter> *a;
a = dynamic_cast<TestSort<Iter> *>(s);
std::vector<type> temp(a->beg(), a->end());
sort(temp->beg(), temp->end());
}
};
template<typename Iter, typename type>
class InsertionSort : public Sort<Iter, type>
{
void sort(Iter beg, Iter end) {
for (Iter i = beg; i != end; ++i)
std::rotate(std::upper_bound(beg, i, *i), i, i+1);
}
};
int main ()
{
std::vector<double> data(100);
std::generate(data.begin(), data.end(), [](){return rand() % 500;} );
auto ts = TestSort<std::vector<double>::iterator >(data.begin(), data.end());
auto is = new InsertionSort<std::vector<double>::iterator, double >();
//.................
ts.observer("InsertionSort", is);
//.........................
ts.Triggerd();
return 0;
}
エラーはわかりますが
error C3867: 'Observer::notify': function call missing argument list; use '&Observer::notify' to create a pointer to member
しかし、この文脈では、私はそれを解決する方法を理解することはできません。
このコンテキストでは、notifyが、ではなく、単に追加可能なメンバー関数であった場合
void (Observer::*notify)(Subject *) = iter->second->notify;
私は単に書くことができた
void (Observer::*notify)(Subject *) = &Observer::notify;
しかし、notifyはポリモーフィック関数であり、コンパイル時に適切な関数に対処できません。
どのように処理すればよいか提案してください