呼び出し可能ビーイングC ++クラステンプレートで静的であることが必要

derkomai:

私は、プログラムの中で、次のクラスを設定しているしたいと思います:

  • バッファを実装するクラス。このバッファは、ときフル、フルバッファをどうするかを処理するためのコールバックを作るスレッドを生成します。
  • バッファ・オブジェクトを含む基本クラステンプレート。実装派生クラスで定義された仮想関数の呼び出しを行うコールバック関数、。
  • 基底クラスと実装の継承は、データをどうするかという派生クラス。

まず、最小限の再現性の例:

#include <vector>
#include <iostream>
#include <thread>

template <typename T>
class CallbackBuffer
{
    public:

        std::vector<T> buffer;
        void (*callback)(std::vector<T>);
        std::thread writerThread;

        CallbackBuffer(int bufferSize = 10)
        {
            buffer.resize(bufferSize);
        }

        void setCallback(void (*cb)(std::vector<T>))
        {
            callback = cb;
        }

        void writeCall()
        {
            writerThread = std::thread(callback, buffer);
        }
};

template <typename T>
class Base
{
    public:

        CallbackBuffer<T> buffer;

        Base()
        {
            buffer.setCallback(bufferHandler);
        }

        void bufferHandler(std::vector<T> v)
        {
            for(auto &i : v)
            {
                write(i);
            }
        }

        virtual void write(T i) = 0;
};

class Derived : public Base<int>
{
    public:

        Derived()
        {
        }

        void write(int i)
        {
            std::cout << i << std::endl;
        }
};

int main()
{
    Derived d;
    return 0;
}

私は、次のコンパイラエラーを取得しています:

error: invalid use of non-static member function ‘void Base<T>::bufferHandler(std::vector<T>) [with T = int]’

コンパイラが必要そうbufferHandlerは静的であるが、私はそれをしなかった場合は、その後、私は、オブジェクトのメンバーへのアクセスを持っていないでしょう。これをソートする方法、あるいは単に恐ろしいアイデアはありますか?

くるみ割り人形:

あなたの中に持っている必要がありますので、あなたは、クラスのメンバ関数を渡しているCallbackBufferようなクラスの何か:

void (Base<T>::*callback)(std::vector<T>);

// ...

void setCallback(void (Base<T>::*cb)(std::vector<T>)) {
    callback = cb;
}

そして、でBase、クラス:

Base() {
    buffer.setCallback(&Base<T>::bufferHandler);
}

デモ

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=384631&siteId=1