Tôi có thư viện với một số đối tượng chức năng có thể chỉ chấp nhận một vài loại tùy thuộc vào std::is_integral
. Tôi muốn std::is_invocable
trả lại false
khi điều kiện không thành công, nhưng tôi cũng muốn có thông báo lỗi static_assert
đẹp khi người dùng cố gắng gọi một phiên bản của đối tượng hàm. Dưới đây là một ví dụ đơn giản của đối tượng chức năng Tôi hiện có:Tận dụng tối đa static_assert và std :: is_invocable
struct function
{
template<typename Iterator>
auto operator()(Iterator first, Iterator last) const
-> std::enable_if_t<std::is_integral_v<
typename std::iterator_traits<Iterator>::value_type
>>
{ /* something */ }
};
Với một thực hiện như vậy, std::is_invocable
là std::false_type
như mong đợi khi điều kiện SFINAE không được đáp ứng, nhưng người dùng gặp phải thông báo lỗi SFINAE xấu xí khi họ cố gắng để gọi đối tượng hàm với các tham số không đáp ứng điều kiện SFINAE.
Để có được các thông báo lỗi tốt hơn, tôi đã thử giải pháp sau đây thay vì:
struct function
{
template<typename Iterator>
auto operator()(Iterator first, Iterator last) const
-> void
{
static_assert(std::is_integral_v<typename std::iterator_traits<Iterator>::value_type>,
"function can only be called with a collection of integers");
/* something */
}
};
Với thực hiện này, người dùng có được các thông báo lỗi thân thiện khi điều kiện SFINAE gốc không được đáp ứng, nhưng std::is_invocable
là std::true_type
khi được hỏi liệu một Ví dụ function
có thể xử lý một loại không đáp ứng std::is_integral
.
Tôi đã thử nhiều thủ đoạn và các biến thể liên quan đến decltype(auto)
, if constexpr
và các cơ chế khác, nhưng không thể có được một lớp học nơi thông báo lỗi là tốt đẹp và nơi std::is_invocable
tương ứng với dự kiến std::false_type
khi đặt câu hỏi liệu function
có thể được gọi với các loại không chính xác.
tôi thiếu gì ở đây? Có cách nào để nhận cả hai thông báo lỗi thân thiện với người dùng std::is_invocable
và thân thiện với người dùng?
Tôi vừa mới viết một bài đăng blog về điều này: https://gracicot.github.io/tricks/2017/07/01/deleted-function-diagnostic.html –