如何将lambda,function object或std :: function作为模板参数传递并控制它们的参数

ard*_*bro 0 c++ templates c++11

我想将一些协议作为类模板实现,其中raw_write和raw_read函数作为模板参数.两个原始函数都有严格定义的接口:

int raw_write(uint8_t *src, size_t len);
int raw_read(uint8_t *dst, size_t maxlen);
Run Code Online (Sandbox Code Playgroud)

当有人试图传递例如时,是否可以通过编译错误控制此接口:

int raw_write2(uint16_t *src, size_t len);
Run Code Online (Sandbox Code Playgroud)

我应该将模板参数作为指定类型的对象传递,还是作为在模板实现中实例化的类型名称?

hmj*_*mjd 7

认为这是用于存储可调用的(或不需要使用已定义的类)的期望(或至少)解决方案: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);
}
Run Code Online (Sandbox Code Playgroud)

使用bad_writer会导致编译失败(没有bad_writer http://ideone.com/hG7tqcbad_writer http://ideone.com/roMJgM).