Нашел кусочек буста, который должен делать то, что мне надо: проверять имеет ли шиблонный тип метод с заданным именем и сигнатурой.
Так вот, собственно «документация»: http://www.boost.org/doc/libs/1_59_0/libs/tti/doc/html/the_type_traits_intros...
И есть такой код, который не компилируется: http://melpon.org/wandbox/permlink/Khvu0EIUAurzngdR
Вкратце:
#include <type_traits>
#include <string>
#include <boost/tti/has_member_function.hpp>
namespace detail
{
BOOST_TTI_HAS_MEMBER_FUNCTION(resize);
template <typename ... Args>
constexpr bool has_member_function_resize_v = has_member_function_resize<Args...>::value;
}
template <typename Container>
constexpr bool has_resize_v = detail::has_member_function_resize_v<void (Container::*)(typename Container::size_type)>;
template <typename Container>
std::enable_if<has_resize_v<Container>>
f1(const Container&) { std::cout << "has resize" << std::endl; }
template <typename Container>
std::enable_if<!has_resize_v<Container>>
f1(const Container&) { std::cout << "no resize" << std::endl; }
int main() {
f1(std::string());
}
prog.cc: In function 'int main()':
prog.cc:46:14: error: call of overloaded 'f1<S>(S)' is ambiguous
f1<S>(S());
^
prog.cc:28:1: note: candidate: std::enable_if<has_resize_v<Container> > f1(const Container&) [with Container = std::__cxx11::basic_string<char>]
f1(const Container&) {
^~
prog.cc:34:1: note: candidate: std::enable_if<(! has_resize_v<Container>)> f1(const Container&) [with Container = std::__cxx11::basic_string<char>]
f1(const Container&) {
^~
Помогите пожалуйста понять, что ему не нравится