есть ли способ решить проблему автоматической перегрузки?
Да, если вы знаете типы аргументов, передаваемых методу.В вашем случае, если я правильно понимаю, Element
.
Ваш ответ покажет, как решить проблему, изменив исходный код.Далее я предлагаю решение, основанное на объявленных только constexpr
функциях
. Есть ли другой способ написать лучшую характеристику hasCount?
Не знаю, лучше ли, но обычно я предпочитаю использовать constexpr
функции.
Что-то следующее ( Внимание: код не проверен проверен непосредственно из OP)
template <typename...>
constexpr std::false_type hasCountF (...);
template <typename T, typename ... As>
constexpr auto hasCountF (int)
-> decltype( std::declval<T>().count(std::declval<As>()...), std::true_type{});
template <typename ... Ts>
using has_count = decltype(hasCountF<Ts...>(1));
и, возможно, также (только из C ++ 14)
template <typename ... Ts>
constexpr auto has_count_v = has_count<Ts...>::value:
, и вы можете назвать его следующим образом
if constexpr ( has_count_v<Container, Element> )
В вашем случае, используя Container
c
и Element
e
в вашей функции вы можете упростить ее (избегая большого количества std::declval()
), и вы можете попробовать с помощью пары функций следующим образом
template <typename...>
constexpr std::false_type hasCountF (...);
template <typename C, typename ... As>
constexpr auto hasCountF (C const & c, As const & ... as)
-> decltype( c.count(as...), std::true_type{});
вызывая ееследующим образом:
if constexpr ( decltype(hasCountF(c, e))::value )
, но я предпочитаю предыдущее решение, потому что требую больше машинописи, но более гибко.