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)
我应该将模板参数作为指定类型的对象传递,还是作为在模板实现中实例化的类型名称?
我认为这是用于存储可调用的(或不需要使用已定义的类)的期望(或至少是)解决方案: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/hG7tqc和bad_writer http://ideone.com/roMJgM).