2017-08-30 21 views
7
#include <functional> 
#include <sys/types.h> 
#include <sys/socket.h> 


std::function<decltype(::bind)> mockbind = ::bind; 

int main() 
{ 
} 

Đoạn mã trên hoạt động trên hầu hết các nền tảng tôi biên dịch. Nhưng trên ubuntu 14.04 sử dụng g ++ - 7 Tôi nhận được một lỗi:C++ xóa bỏ loại trừ khỏi decltype trả về loại

X.cpp:7:65: error: variable ‘std::function<int(int, const sockaddr*, unsigned int) noexcept> mockbind’ has initializer but incomplete type 
std::function<int(int, const sockaddr*, unsigned int) noexcept> mockbind = ::bind; 
                   ^~~~~~~~ 

Bây giờ nếu tôi tự đi và thay đổi kiểu của mockbind

std::function<int(int, const sockaddr*, unsigned int) noexcept> mockbind = ::bind; 

Đúng như dự đoán tôi nhận được lỗi tương tự:
Bây giờ nếu Tôi xóa số noexcept

std::function<int(int, const sockaddr*, unsigned int)> mockbind = ::bind; 

Nó biên dịch như mong đợi.

Vì vậy, câu hỏi là tôi có thể áp dụng một số mã mẫu để loại bỏ các noexcept từ loại trả lại bởi decltype và làm cho nó hoạt động như mong đợi.

+0

Không 'auto mockbind = :: bind' làm những gì bạn muốn? – whoan

+0

@whoan: Không vì nó không tạo đối tượng kiểu 'std :: function <>'. Nếu không có nó sẽ được khó khăn để ràng buộc funcotors để 'mockbind'. –

Trả lời

10

Một lớp đơn giản chuyên môn lừa nên làm việc:

template <typename T> struct remove_noexcept 
{ 
    using type = T; 
}; 
template <typename R, typename ...P> struct remove_noexcept<R(P...) noexcept> 
{ 
    using type = R(P...); 
}; 
template <typename T> using remove_noexcept_t = typename remove_noexcept<T>::type; 

// ... 

std::function<remove_noexcept_t<decltype(::bind)>> mockbind = ::bind; 

Bạn có thể phần nào dễ dàng mở rộng nó để loại bỏ noexcept từ [thành viên] chức năng gợi ý, những gì còn lại là một excercise để người đọc.

Ngoài ra, bạn có thể nhận xét ra using type = T; nếu bạn muốn nhận lỗi biên dịch nếu không có noexcept thay vì để nguyên loại không thay đổi.

+1

Tôi giả định điều này cũng làm việc thêm chuyên môn cho các chức năng thành viên cũng như – SirGuy

+0

@SirGuy Có, nó nên. Tôi quyết định không bận tâm vì sự đơn giản. – HolyBlackCat

+0

Hình. Tốt. Tôi sẽ kiểm tra nó tối nay khi tôi về nhà –

Các vấn đề liên quan