Mam bibliotekę z kilkoma obiektami funkcji, które mogą akceptować tylko kilka typów w zależności od std::is_integral
. Chcę, aby std::is_invocable
zwrócił false
, gdy warunek się nie powiedzie, ale chcę również ładny komunikat o błędzie static_assert
, gdy użytkownik próbuje wywołać instancję obiektu funkcji. Oto uproszczony przykład obiektów funkcyjnych Obecnie mam:Najlepsze wyniki static_assert i 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 */ }
};
Dzięki takiej realizacji, std::is_invocable
jest std::false_type
jak oczekiwano, gdy warunek SFINAE nie jest spełniony, ale użytkownicy napotykają brzydkich komunikatów o błędach SFINAE gdy próbują zadzwonić obiekt funkcji z parametrami, które nie spełniają warunku SFINAE.
Aby uzyskać lepsze komunikaty o błędach, próbowałem następujące rozwiązanie zamiast:
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 */
}
};
Dzięki tej realizacji, użytkownicy otrzymują przyjazne komunikaty o błędach, gdy oryginalny stan SFINAE nie jest spełniony, ale std::is_invocable
jest std::true_type
pytany, czy function
wystąpienie może obsłużyć typ, który nie spełnia std::is_integral
.
Próbowałem kilka sztuczek i zmian obejmujących decltype(auto)
, if constexpr
i innych mechanizmów, ale nie mógł dostać klasę gdzie komunikaty o błędach były ładne i gdzie std::is_invocable
odpowiadała oczekiwanemu std::false_type
gdy pytając czy function
mógł być wywołany z niewłaściwych typów.
Czego mi tu brakuje? Czy istnieje sposób na uzyskanie odpowiednich komunikatów o błędach przyjaznych dla użytkownika?
Właśnie napisałem post na blogu na ten temat: https://gracicot.github.io/tricks/2017/07/01/deleted-function-diagnostic.html –