Часто в коде я пишу, что есть типы, совместимые с макетами, но разные типы, но все же я бы хотел их обойти, как если бы они были того же типа. Это приходит с довольно синтаксическими накладными расходами, в том числе необходимых слепков и т.д.Насколько совместим с нормами мой полиморф?
Я (очень) недавно придумал небольшие вспомогательный микс в классе, который я дублировал polymorph
:
struct polymorph
{
template<typename T>
const T& as() const { return reinterpret_cast<const T&>(*this); }
template<typename T>
T& as() { return reinterpret_cast<T&>(*this); }
}
Небольшого примера «демонстрирует «это для классической« мой сложный номер типа лучше вашей »ситуации here *. Мой вопрос: насколько я уверен в этом классе и как я могу сделать это более устойчивым к неправильному использованию и/или неопределенному поведению. Я не использовал его много, и я колеблюсь, потому что есть много вещей, которые могут пойти ужасно неправильно.
Этот класс в основном предназначен для соответствий, таких как между _Complex
/std::complex<double>
/double[2]
. Я все еще думаю о хорошем способе продлить его, чтобы выполнить полезные преобразования, и насколько это было бы полезно.
* Примечание. Я не говорю, что это абсолютно не определено - поведение бесплатное. Отсюда этот вопрос.
Это похоже на то, что вы хотите ['std :: variant'] (http://en.cppreference.com/w/cpp/utility/variant) – NathanOliver
@Nathan Я явно не хочу список ограниченного типа. – rubenvb
Что касается 'complex' <-> 'float/double [2]', это хорошо определено, потому что стандарт говорит об этом. В противном случае я считаю, что такой тип пиннинга подходит только для союзов, где типы членов имеют общие начальные последовательности. –
Praetorian