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