LINUX.ORG.RU

Интроспекция с boost

 , ,


0

2

Нашел кусочек буста, который должен делать то, что мне надо: проверять имеет ли шиблонный тип метод с заданным именем и сигнатурой.

Так вот, собственно «документация»: 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&) {
 ^~

Помогите пожалуйста понять, что ему не нравится

А слона-то я и не заметил:

-std::enable_if<...>
+std::enable_if_t<...>

KennyMinigun ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.