Удалить часть типа члена класса из decltype - PullRequest
0 голосов
/ 23 декабря 2019

Я столкнулся с делом, которого раньше не видел, при использовании decltype для члена шаблонного класса. Я хотел сделать более приятным make_unique, чтобы изменение типа члена не приводило к исправлению вызовов make_unique. Я хотел избежать этого, используя decltype(member)::element_type в качестве типа для make_unique, но получил ошибку. Вот простой фрагмент, который показывает ошибку (и я понимаю, почему она отображается):

#include <memory>

template<typename T>
struct foo
{
    foo()
    {
        // g++ gives:
        //   dependent-name 'decltype (((foo<T>*)this)->foo<T>::p_)::element_type' is parsed as a non-type, but instantiation yields a type
        //   say 'typename decltype (((foo<T>*)this)->foo<T>::p_)::element_type' if a type is meant
        //
        // How can I atleast remove the class name from the type?
        p_ = std::make_unique<decltype(p_)::element_type>();
        // g++ gives:
        //  dependent-name 'decltype (p)::element_type' is parsed as a non-type, but instantiation yields a type
        //  say 'typename decltype (p)::element_type' if a type is meant
        //
        // makes sense since p here is dependent on T
        std::unique_ptr<T> p = std::make_unique<decltype(p)::element_type>();
        // This one is fine, makes sense, since the type is known
        std::unique_ptr<int> p2 = std::make_unique<decltype(p2)::element_type>();
    }
    std::unique_ptr<T> p_;
};

int main()
{
    foo<int> f;
    return 0;
}

Мой вопрос, есть ли хороший / красивый способ удалить 'is member of' ((foo<T>*)this)->foo<T>::p_)) часть из значения decltype, чтобы, по крайней мере, я мог использовать то же исправление и просто указать typename для переменной-члена p_? Длинное исправление, предложенное g++, кажется уродливым.

Через 5 минут после публикации у меня возникла мысль, что я могу сделать

p_ = std::make_unique<decltype(std::remove_reference(*p_)::type)>();

, но, похоже, это дает ошибку разбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...