从 decltype 中删除 class 成员类型部分
Remove class member type part from decltype
我 运行 进入我以前从未见过的案例,同时在模板化 class 的成员上使用 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;
}
我的问题是,是否有一种 nice/pretty 方法可以从 decltype
值中删除 'is a member of' ((foo<T>*)this)->foo<T>::p_)
) 部分,这样至少我可以使用同样的修复并简单地在成员变量 p_
上提供 typename
? g++
建议的长修复似乎有点难看。
发帖 5 分钟后,我想到了我可以做的事情
p_ = std::make_unique<decltype(std::remove_reference(*p_)::type)>();
但这似乎给出了一个解析错误。
您可以简单地在 decltype()
之前放置一个 typename
。
我是说
p_ = std::make_unique<typename decltype(p_)::element_type>();
我 运行 进入我以前从未见过的案例,同时在模板化 class 的成员上使用 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;
}
我的问题是,是否有一种 nice/pretty 方法可以从 decltype
值中删除 'is a member of' ((foo<T>*)this)->foo<T>::p_)
) 部分,这样至少我可以使用同样的修复并简单地在成员变量 p_
上提供 typename
? g++
建议的长修复似乎有点难看。
发帖 5 分钟后,我想到了我可以做的事情
p_ = std::make_unique<decltype(std::remove_reference(*p_)::type)>();
但这似乎给出了一个解析错误。
您可以简单地在 decltype()
之前放置一个 typename
。
我是说
p_ = std::make_unique<typename decltype(p_)::element_type>();