Tôi cần lấy loại được cung cấp khi tạo mẫu. Hãy xem xét ví dụ sau:decltype và toán tử phạm vi trong C++
template <typename T> struct Foo
{
typedef T TUnderlying;
};
static Foo<int> FooInt;
class Bar
{
public:
auto Automatic() -> decltype(FooInt)::TUnderlying
{
return decltype(FooInt)::TUnderlying();
}
};
int main()
{
Bar bar;
auto v = bar.Automatic();
return 0;
}
Sự cố với mã này đang sử dụng toán tử phạm vi cùng với decltype. Visual C++ 2010 phàn nàn như thế này:
lỗi C2039: 'TUnderlying': không phải là thành viên của '`namespace toàn cầu''
tôi thu thập được một số thông tin về chủ đề này trên Wikipedia:
Trong khi bình luận về Dự thảo Ủy ban chính thức cho C++ 0x, cơ quan thành viên ISO Nhật Bản lưu ý rằng "một toán tử phạm vi (: :) không thể được áp dụng cho decltype, nhưng nó nên được. Nó sẽ hữu ích trong trường hợp để có được kiểu thành viên (lồng nhau- loại) từ một ví dụ như sau ": [16]
vector<int> v;
decltype(v)::value_type i = 0; // int i = 0;
Điều này, và các vấn đề tương tự đã được giải quyết bởi David Vandevoorde, và được bỏ phiếu vào bài báo làm việc tháng 3 năm 2010.
Vì vậy, tôi nghĩ rằng Visual C++ 2010 không thực hiện điều này. Tôi đã đưa ra cách giải quyết này:
template <typename T> struct ScopeOperatorWorkaroundWrapper
{
typedef typename T::TUnderlying TTypedeffedUnderlying;
};
auto Automatic() -> ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying
{
return ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying();
}
Tôi có bỏ lỡ bất kỳ giải pháp nào thanh lịch và tiết kiệm hơn không?
bạn đã thử 'FooInt :: TUnderlying' thay vì 'decltype (FooInt) :: TUnderlying'?Tôi không thấy những gì bạn mong đợi để đạt được thông qua 'decltype' ở đây. – sellibitze
Tất cả những gì bạn thêm là 'ScopeOperatorWorkaroundWrapper <>', tôi không biết số lượng "ít tiết" hơn bạn có thể muốn. Sau khi tất cả, một workaround của nó. – PlasmaHH