четверг, 5 июня 2014 г.

[prog.c++] Интересный макрос для объявления строковых констант в hpp-файлах

Увидел здесь: Lightweight HTTP Server in less than 40 Lines on libevent and C++11 . Признаюсь, раньше я не сталкивался с идеей использовать шаблонную структуру и ее специализацию для типа void. Сокращенный автономный пример, демонстрирующий и сам макрос, и результаты его применения:

#include <iostream>

#define DECLARE_STRING_CONSTANT(name_, value_) \
  namespace Private \
  { \
    template <typename T> \
    struct name_ \
    { \
      static char const Name[]; \
      static char const Value[]; \
    }; \
    template <typename T> \
    char const name_ <T>::Name[] = #name_; \
    template <typename T> \
    char const name_ <T>::Value[] = #value_; \
  } \
  typedef Private:: name_ <void> name_;

namespace Http
{
  namespace Request
  {
    namespace Header
    {
      DECLARE_STRING_CONSTANT(Accept, Accept)
      DECLARE_STRING_CONSTANT(AcceptCharset, Accept-Charset)
    }
  }
}

int main()
{
  std::cout << Http::Request::Header::Accept::Name << " -> "
      << Http::Request::Header::Accept::Value << std::endl;

  std::cout << Http::Request::Header::AcceptCharset::Name << " -> "
      << Http::Request::Header::AcceptCharset::Value << std::endl;
}

PS. Насколько я помню, в библиотеке POCO так же есть HTTP-сервер. Так что на POCO простейший HTTP-сервер, возможно, был бы еще короче :)

Комментариев нет: