0

テンプレート引数として raw_write および raw_read 関数を使用して、いくつかのプロトコルをクラス テンプレートとして実装したいと考えています。両方の生の関数には、厳密に定義されたインターフェイスがあります。

int raw_write(uint8_t *src, size_t len);
int raw_read(uint8_t *dst, size_t maxlen);

たとえば、誰かがパスしようとしたときにコンパイルエラーでこのインターフェイスを制御する方法はありますか:

int raw_write2(uint16_t *src, size_t len);

テンプレート引数を指定された型のオブジェクトとして渡すか、テンプレートの実現内でインスタンス化された型名として渡す必要がありますか?

4

2 に答える 2

7

これは、callable を格納するために使用する望ましい (または少なくとも ) ソリューションだと思います (定義済みのクラスを使用する必要ありませ) 。std::functiontemplate

#include <iostream>
#include <functional>

struct protocol_callbacks
{
    using func_t = std::function<int(uint8_t*, size_t)>;

    protocol_callbacks(func_t a_reader, func_t a_writer) :
        reader(a_reader),
        writer(a_writer) {}
    func_t reader;
    func_t writer;
};

int writer(uint8_t*, size_t) { return 0; }
int reader(uint8_t*, size_t) { return 0; }

int bad_writer(uint16_t*, size_t) { return 0; }

int main ()
{
    protocol_callbacks pc1(reader, writer);
    protocol_callbacks pc2([](uint8_t*, size_t) { return 0; },
                           [](uint8_t*, size_t) { return 0; });
    //protocol_callbacks pc3(bad_writer, reader);
}

を使用するbad_writerと、コンパイルが失敗します ( http://ideone.com/hG7tqc を使用せず、http://ideone.com/roMJgMbad_writer 使用した場合)。bad_writer

于 2013-05-10T14:54:55.970 に答える