Есть ли способ проверить, есть ли у class
typedef
, который работает даже для private
typedef
?
Следующий код работает в VS2013, но не работает на gcc ideone
template<typename T>
struct to_void
{
typedef void type;
};
class Foo
{
typedef int TD;
};
template <typename T, typename dummy = void>
struct has_TD : std::false_type {};
template <typename T>
struct has_TD<T, typename to_void<typename T::TD>::type > : std::true_type{};
int main()
{
std::cout << std::boolalpha << has_TD<Foo>::value << std::endl;
}
изменить — почему я хочу это
У меня есть собственная система сериализации, которая может сериализовать произвольный тип. У него есть несколько перегрузок, когда он должен вести себя по-разному (например, строка). Для остальных типов он просто записывает значение в память. Если у меня есть составной тип, я иногда могу просто записать в память (сохранение и загрузка происходят на той же архитектуре, скомпилированы одним и тем же компилятором, поэтому отступы будут одинаковыми и т. д.). Этот метод действителен, например, для типов POD (черта std::is_pod
), но все типы POD являются лишь подмножеством всех типов, поддерживающих эту сериализацию.
Итак, у меня в основном есть шаблонная функция write<T>
, которая просто записывает sizeof(T)
байт (необработанная сериализация)... Но я не хочу, чтобы это вызывалось по ошибке, я хочу, чтобы пользователь явно сказал в своем классе: "этот класс/структура может быть сериализованным"). Я делаю это с помощью макроса ALLOW_RAW_SERIALIZE
, который определяет некоторый typedef, который можно проверить с помощью типажа. Если класс MyClass
не содержит typedef, вызов write(myClassInstance)
вызовет ошибку компилятора.
Вещи, которые в основном решают, может ли класс быть сериализованным, - это его члены (без отражения члены не могут быть перечислены и проверены автоматически, поэтому пользователь должен предоставить такую информацию). типичный класс выглядит так:
class
public
ctor-dtor
methods
private
methods
members
и я хочу, чтобы пользователи разрешали писать ALLOW_RAW_SERIALIZE
как можно ближе к участникам, поэтому, когда они меняют некоторых членов, меньше шансов забыть об обновлении ALLOW_RAW_SERIALIZE
(удалите его, когда он больше недействителен)
Вот почему я хочу проверить private typedef
Поскольку он заменяет отражение и берет весь тип и записывает его, я не врубаюсь в это, например, в нарушение инкапсуляции или что-то в этом роде...
ALLOW_RAW_SERIALIZE
уже является макросом, то, конечно, вы можете расширить этот макрос, чтобы просто сделать вашу проверку сериализацииfriend
? - person   schedule 05.01.2016