将纯虚拟接口替换为 lambda

Replacing pure virtual interfaces with lambdas

本文关键字:lambda 替换 接口 虚拟      更新时间:2023-10-16

我需要实现以下接口:

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 );