3

次のインターフェイスを実装する必要があります。

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;

私は次のようにラムダを使用できると考えました:

// 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ではコンパイルできません。

このようなラムダを、つまり純粋な仮想インターフェースの代わりに使用することは可能ですか?私の焦点は、仮想関数のオーバーヘッドではなく、定型コードの削減です。

4

1 に答える 1

3

簡単な答えはノーです。ラムダを使用してインターフェースを実装することはできません。ラムダの唯一のインターフェースは必須operator()であり、それは非仮想です。ラムダはどのタイプからも継承せず、継承することもできません。

できることは、使用に近い拡張タイプの定義を提供し、キャプチャを手動で実装することです。

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 );
于 2012-10-08T21:55:07.410 に答える