将纯虚拟接口替换为 lambda
Replacing pure virtual interfaces with lambdas
我需要实现以下接口:
class xml_writer
{
public:
virtual void write(const void* data, size_t size) = 0;
};
void xml_document::save(xml_writer& writer, const char_t* indent = "t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
我想我可以像这样使用lambda:
// call save on XML passing lambda in place of xml_writer
std::array<char, 4096> request;
xml->save([&](const void* data, const std::size_t size) { std::memcpy(request.begin(), data, size); });
但是唉,它无法在 clang3.1 中编译!
是否可以像这样使用lambda,即代替纯虚拟推理?我的重点是减少样板代码,而不是那么多的虚拟函数开销。
简单的答案是否定的,你不能使用 lambda 来实现接口。lambda的唯一接口是必需的operator()
,这是非虚拟的。Lambda 不会从任何类型继承,也不能从任何类型继承。
您可以做的是提供接近使用的扩展类型的定义,并手动实现捕获:
std::array<char,4096> request;
struct ToArrayWriter : xml_writer {
ToArrayWriter(std::array<char,4096>& array) : array(array) {}
void write( const void* data, size_t size ) {
std::memcpy(&array[0],data,size);
}
std::array<char,4096>& array;
} writer(request);
xml->save( writer );
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- 如何用转义符替换字符串中的所有特殊字符
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 模板参数推导/替换失败,lambda作为函数指针
- C++ 转换和 lambda - 替换循环
- 用C 中的lambda替换功能
- lambda 是否应该替换 C++ 中的函数模板
- 模板参数扣除/替换使用Lambda表达式使用高阶函数失败
- 将纯虚拟接口替换为 lambda
- Visual Studio 2005中的Lambda函数替换--Boost库