От стандарта C++:Использование offsetof для шаблонных классов
Класс стандартного макета класс, который:
- не имеет нестатических элементов данных класса типа нестандартного макета (или массив таких типов) или ссылки,
- не имеет виртуальные функции (10.3) и никаких виртуальных базовых классов (10.1),
- имеет один и тот же контроль доступа (пункт 11) для всех не-го элементы данных АИКТА, - не имеют нестандартной компоновку базовых классов,
- либо не имеют не-статические элементов данных в наиболее производном классе и не более одного базового класса с не-статическими элементами данных, или имеют нет базы классы с не-статические элементы данных, и
- не имеет базовых классов одного и того же типа, что и первый не-статические данные член
макрос offsetof (тип, член-целеуказатель) принимает ограниченный набор аргументов типа в этом международном стандарте. Если тип не является класс стандартного макета (пункт 9), результаты не определены
Учитывая эти заявления, есть ли безопасный способ использования offsetof
для членов, которые зависят от параметров шаблона? Если нет, как мне получить смещение члена в шаблонных классах? Что может быть небезопасным при использовании чего-то типа:
//MS Visual Studio 2013 definition
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
по нестандартным классам макетов?
После образца, где не SAFE в соответствии со стандартом:
#include <cstddef>
#include <iostream>
template<typename T>
struct Test
{
int a;
T b;
};
struct NonStdLayout
{
virtual void f(){};
};
int main()
{
std::cout << offsetof(Test<int>, b) << std::endl;
std::cout << offsetof(Test<NonStdLayout>, b) << std::endl;
return 0;
}