Затухание значения шаблонного типа в C++
Я реализую простой вариант класса (в основном для практики), и я столкнулся с проблемой с распадом типа. Я хотел бы создать конструктор, который принимает подтип варианта и конструирует его соответствующим образом ( case (4) здесь, конструктор преобразования).
Для копирования и перемещения у меня есть вспомогательный класс, который содержит такие функции:
static inline void copy(std::size_t old_type_id, void* old_data, void* new_data);
static inline void move(std::size_t old_type_id, void* old_data, void* new_data);
Так что я передаю все как void*
для простоты. Мой конвертирующий конструктор выглядит так:
template <typename T>
variant(T&& v)
: type_id{ typeid(std::decay_t<T>).hash_code() } {
if constexpr (std::is_lvalue_reference_v<T>) {
helper_type::copy(type_id, reinterpret_cast<void*>(&v), &data);
}
else {
helper_type::move(type_id, reinterpret_cast<void*>(&v), &data);
}
}
Моя идея состояла в том, чтобы проверить, если это ссылка, потому что тогда мы можем только копировать, в противном случае двигаться. Но потому что v
является параметром-шаблоном, автоматического распада типов не происходит, и если я пытаюсь передать строку в стиле C, я получаю следующие ошибки:
не может конвертировать из 'const char (*)[6]' в 'void *'
Есть ли способ сделать это преобразование, не специализируя каждый распадающийся тип?
1 ответ
Как говорит liliscent, вам нужно использовать const void*
,
Это потому, что хотя void*
может принимать любой тип указателя, он все еще связан с правилами, которые утверждают, что преобразование из const T*
в T*
плохо сформирован, если вы не используете const_cast
(чего не следует делать в этом случае).