Sau khi đọc câu trả lời của Matthieu here, tôi quyết định tự mình thử.SFINAE decltype comma operator lừa
Nỗ lực của tôi không biên dịch được vì SFINAE không khởi động và hủy bỏ chức năng has_foo
cố gắng truy cập T::foo
.
error: ‘struct Bar’ has no member named ‘foo’
Tôi có thiếu thứ gì đó hoặc những gì tôi đang cố gắng không thể thực hiện theo cách này?
(Tôi đang sử dụng gcc-4.7.2)
Full examplar dưới đây:
#include <iostream>
// culled by SFINAE if foo does not exist
template<typename T>
constexpr auto has_foo(T& t) -> decltype((void)t.foo, bool())
{
return true;
}
// catch-all fallback for items with no foo
constexpr bool has_foo(...)
{
return false;
}
//-----------------------------------------------------
template<typename T, bool>
struct GetFoo
{
static int value(T& t)
{
return t.foo;
}
};
template<typename T>
struct GetFoo<T, false>
{
static int value(T&)
{
return 0;
}
};
//-----------------------------------------------------
template<typename T>
int get_foo(T& t)
{
return GetFoo<T, has_foo(t)>::value(t);
}
//-----------------------------------------------------
struct Bar
{
int val;
};
int main()
{
Bar b { 5 };
std::cout << get_foo(b) << std::endl;
return 0;
}
Nó nói 'val' man, not' foo'! – Rapptz
@Rapptz - chính xác! Đó là vụ phải ** cull ** phương thức 'has_foo (true)' và sử dụng phương thức dự phòng –
Ah man, xin lỗi. Tôi chỉ nhanh chóng lướt qua nó vì vậy tôi đã không hoàn toàn hiểu được câu hỏi :) – Rapptz