Я использую BOOST_FUSION_ADAPT_STRUCT()
, и мне нужно проверить, что все участники объявлены и в правильном порядке. Итак, сначала я сделал это:Boost Fusion: проверять адаптированный порядок элементов структуры во время компиляции
template <typename Sequence>
struct checker
{
static void check()
{
typedef typename mpl::accumulate<Sequence, mpl::size_t<0>,
mpl::plus<mpl::_1, mpl::sizeof_<mpl::_2>>>::type total_size;
static_assert(sizeof(Sequence) == total_size::value, "omitted field?");
}
};
И это работает:
struct foo
{
int x;
float y;
double z;
};
BOOST_FUSION_ADAPT_STRUCT(foo, x, y, z);
checker<foo>::check(); // fails if any field is missing
Далее я хочу убедиться, что порядок является правильным, так, например, (x, z, y)
в приведенном выше примере должен не компилировать. Но до сих пор я только понял, решение во время выполнения (добавляется check()
):
const Sequence* dummy = nullptr;
++dummy;
boost::fusion::for_each(*dummy, struct_offset_checker());
Используя этот функтор:
struct struct_offset_checker
{
mutable const void* _last = nullptr;
template <typename Element>
void operator()(const Element& element) const
{
if (&element <= _last)
throw std::logic_error("struct member is declared in a different order");
_last = &element;
}
};
Но я предпочел бы иметь время компиляции решения. Можете ли вы подумать об одном?
Самое смешное, что GCC на самом деле в состоянии выяснить, во время компиляции, когда будет сгенерировано исключение, если у меня есть -Wsuggest-attribute=noreturn
- он говорит мне, когда функция, которая вызывает check()
не вернется (из-за logic_error
).
Если вы хотите попробовать это самостоятельно, соответствующие заголовки:
#include <stdexcept>
#include <boost/fusion/adapted.hpp>
#include <boost/mpl/accumulate.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/sizeof.hpp>
#include <boost/mpl/size_t.hpp>
Ваш чек упущение не принимает во внимание отступы - http://coliru.stacked-crooked.com/a/88ff885041f95349 – Praetorian
, какой стандарт C++ вы используете? можете ли вы использовать C++ 11 или C++ 14? –
@ м.с .: Я использую C++ 14. –