Затухание значения шаблонного типа в 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 (чего не следует делать в этом случае).

Другие вопросы по тегам