Хочется примерно следующего: для типов, у которых есть typedef определённого имени — вызывать один вариант функции, у которых не определён — другой. Что-то вроде enable_if<has_typedef<T::some_type_name>::value>.
Желательно, чтобы работало это так: есть иерархия, в одном из её далёких предков я определяю typedef — и вуаля, машинерия заработала для всех потомков (что-то мне подсказывает, что с этим могут быть проблемы — вроде бы базовые тайпдефы при обработке потомков в шаблонах не учитываются — или я путаю что-то...)
Есть подсказки, как бы это реализовать?
Re: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, cheqa, Вы писали:
C>Здравия.
C>Хочется примерно следующего: для типов, у которых есть typedef определённого имени — вызывать один вариант функции, у которых не определён — другой. Что-то вроде enable_if<has_typedef<T::some_type_name>::value>. C>Желательно, чтобы работало это так: есть иерархия, в одном из её далёких предков я определяю typedef — и вуаля, машинерия заработала для всех потомков (что-то мне подсказывает, что с этим могут быть проблемы — вроде бы базовые тайпдефы при обработке потомков в шаблонах не учитываются — или я путаю что-то...)
C>Есть подсказки, как бы это реализовать?
Здравствуйте, cheqa, Вы писали:
C>Здравия.
C>Хочется примерно следующего: для типов, у которых есть typedef определённого имени — вызывать один вариант функции, у которых не определён — другой. Что-то вроде enable_if<has_typedef<T::some_type_name>::value>. C>Желательно, чтобы работало это так: есть иерархия, в одном из её далёких предков я определяю typedef — и вуаля, машинерия заработала для всех потомков (что-то мне подсказывает, что с этим могут быть проблемы — вроде бы базовые тайпдефы при обработке потомков в шаблонах не учитываются — или я путаю что-то...)
C>Есть подсказки, как бы это реализовать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, Erop, Вы писали:
C>>Хочется примерно следующего: для типов, у которых есть typedef определённого имени — вызывать один вариант функции, у которых не определён — другой. Что-то вроде enable_if<has_typedef<T::some_type_name>::value>. C>>Желательно, чтобы работало это так: есть иерархия, в одном из её далёких предков я определяю typedef — и вуаля, машинерия заработала для всех потомков (что-то мне подсказывает, что с этим могут быть проблемы — вроде бы базовые тайпдефы при обработке потомков в шаблонах не учитываются — или я путаю что-то...)
C>>Есть подсказки, как бы это реализовать?
E>
Вопрос чисто академический: можно ли усовершенствовать это решение, что бы оно работало (хотя бы компилировалось), когда доступ к TriggerType закрыт (либо он объявлен как private/protected, либо кто-то из потомков использует закрытое наследование)?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, rg45, Вы писали:
R>Вопрос чисто академический: можно ли усовершенствовать это решение, что бы оно работало (хотя бы компилировалось), когда доступ к TriggerType закрыт (либо он объявлен как private/protected, либо кто-то из потомков использует закрытое наследование)?
Здравствуйте, rg45, Вы писали:
R>Вопрос чисто академический: можно ли усовершенствовать это решение, что бы оно работало (хотя бы компилировалось), когда доступ к TriggerType закрыт (либо он объявлен как private/protected, либо кто-то из потомков использует закрытое наследование)?
Для typedef, скорее всего нельзя.
А вот для поля, скорее всего можно. Для этого надо параметризовать Void указателем на поле...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, cheqa, Вы писали:
C>Здравия.
C>Хочется примерно следующего: для типов, у которых есть typedef определённого имени — вызывать один вариант функции, у которых не определён — другой. Что-то вроде enable_if<has_typedef<T::some_type_name>::value>. C>Желательно, чтобы работало это так: есть иерархия, в одном из её далёких предков я определяю typedef — и вуаля, машинерия заработала для всех потомков (что-то мне подсказывает, что с этим могут быть проблемы — вроде бы базовые тайпдефы при обработке потомков в шаблонах не учитываются — или я путаю что-то...)
C>Есть подсказки, как бы это реализовать?
В CCore это реализовано вот так (пример).
/* struct ProbeSet_ArrayAlgoType */struct ProbeSet_ArrayAlgoType
{
template <class T> struct Host;
template <class T>
static constexpr bool Probe(...) { return false; }
template <class T>
static constexpr bool Probe(Host<typename T::ArrayAlgoType> *) { return true; } // К сожалению, имя не может быть параметром шаблона.
};
/* struct Has_ArrayAlgoType<T> */template <class T>
struct Has_ArrayAlgoType : Meta::Has<T,ProbeSet_ArrayAlgoType> {};
Has_ArrayAlgoType<T>::Ret даёт ответ на вопрос о существовании в классе внутреннего типа ArrayAlgoType.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, rg45, Вы писали:
R>>Вопрос чисто академический: можно ли усовершенствовать это решение, что бы оно работало (хотя бы компилировалось), когда доступ к TriggerType закрыт (либо он объявлен как private/protected, либо кто-то из потомков использует закрытое наследование)?
RO>В C++11 должно работать благодаря новой редакции 14.8.2/8, см. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1170
Здравствуйте, Serg27, Вы писали:
S>Чтоб не тратить лишние секунды на понимание кода, лучше добавить определение Void в начало:
S>
S>template <typename T> struct Void {};
S>
Да, конесно же лучше. Просто при копи-пасте промазал.
Прошу прощения.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, Кодт, Вы писали:
К>Любишь магические типы, или просто торопился и поленился?
просто считаю, что так понятнее и короче.
В смысле, no_type заводить лень, а yes_type без no заводить странно.
Ну и ссылка на массив менее понятна, чем структура из двух чаров. Это же пример, что бы обхяснить, а не ребус...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: дискриминировать типы, у которых не объявлен подтип
Но мне кажется, что я и так уже достаточно просто и доходчиво передал идею. Это пусть Лаптев думает, как надо идеально это писать с методической точки зрения...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, Erop, Вы писали:
К>>Любишь магические типы, или просто торопился и поленился? E>просто считаю, что так понятнее и короче.
Насчёт короче — да. Насчёт понятнее — прямая аналогия с магическими числами.
E>В смысле, no_type заводить лень, а yes_type без no заводить странно.
Для демо-кода их можно вообще не объявлять, а оставлять за скобками. В конце концов, именно эти два типа уже объявлены в бусте.
E>Ну и ссылка на массив менее понятна, чем структура из двух чаров. Это же пример, что бы обхяснить, а не ребус...
Издевательское инфиксное объявление функции char (&testIt(arguments go here))[2]; — безусловно менее понятно.
Перекуём баги на фичи!
Re[4]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, Erop, Вы писали:
E>Кроме того, если честно, мне ID no_type вообще не нравится. Я его читаю, как "нет типа".
Это ж всё в контексте познаётся. Рядом с yes_type прочитать неправильно — сложновато. Опять же, устоявшаяся идиома.
E>Возможно понятнее всего было бы написать так:
Если дискриминация не да-нет, а так-этак-растак-никак, то годный подход!
E>Но мне кажется, что я и так уже достаточно просто и доходчиво передал идею. Это пусть Лаптев думает, как надо идеально это писать с методической точки зрения...
Запомню отмазку. Ну, Лаптев, берегись!
Перекуём баги на фичи!
Re[5]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, Кодт, Вы писали:
К>Для демо-кода их можно вообще не объявлять, а оставлять за скобками. В конце концов, именно эти два типа уже объявлены в бусте.
может и можно, но мне кажется, что так понятнее..
К>Издевательское инфиксное объявление функции char (&testIt(arguments go here))[2]; — безусловно менее понятно.
А я такого и не писал, хотя мог бы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: дискриминировать типы, у которых не объявлен подтип
Здравствуйте, Erop, Вы писали:
E>Но мне кажется, что я и так уже достаточно просто и доходчиво передал идею. Это пусть Лаптев думает, как надо идеально это писать с методической точки зрения...
С "методической точки зрения" лучше использовать constexpr и возвращать true и false.
Здравствуйте, Erop, Вы писали:
E>Кроме того, если честно, мне ID no_type вообще не нравится. Я его читаю, как "нет типа".
E>Возможно понятнее всего было бы написать так: [c]template<int N>struct nChar { char Body[N]; };
Хм... я частенько делаю частичную специализацию функций через такой вот примерно шаблон:
Тогда можно будет не только по bool, но и по знаениям enum перегрузку делать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском