std::is_integral
'a bağlı olarak yalnızca birkaç türü kabul eden birkaç işlev nesnesine sahip bir kitaplığım var. Koşul başarısız olduğunda dönmek için std::is_invocable
istiyorum, ancak bir kullanıcı işlev nesnesinin bir örneğini çağırmaya çalıştığında ben de güzel bir hata iletisi istiyorum. İşte fonksiyon nesnelerin basitleştirilmiş bir örnektir Şu anda var:static_assert ve std :: is_invocable öğesinin en iyisine sahip olmak
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 */ }
};
, std::is_invocable
SFINAE koşul karşılanmadığında beklendiği gibi std::false_type
olmakla birlikte, arama çalıştığınızda kullanıcıların çirkin SFINAE hata mesajlarıyla karşılaşabilirsiniz işlev nesnesi, SFINAE koşulunu karşılamayan parametrelerle.
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 */
}
};
, kullanıcılar özgün SFINAE koşulları sağlamadığını dostu hata iletileri almak, ancak olmadığını sorulduğunda std::is_invocable
std::true_type
geçerli:
daha iyi hata iletileri almak için, bunun yerine aşağıdaki çözümü çalıştı function
örneği, std::is_integral
ürününü karşılamayan bir tür işleyebilir.
decltype(auto)
,
if constexpr
ve diğer mekanizmaları kapsayan çeşitli hile ve varyasyonlar denedi, ancak hata iletileri güzel bir sınıf alamadım ve
std::is_invocable
beklenen
std::false_type
karşılık nereye
function
yanlış türleri ile çağırılacak olup isterken.
Burada nelerin eksik? Doğru std::is_invocable
ve kullanıcı dostu hata iletileri almanın bir yolu var mı?
Kısa bir süre önce bu konuyla ilgili bir blog yazısı yazdım: https://gracicot.github.io/tricks/2017/07/01/deleted-function-diagnostic.html –