Я пытаюсь извлечь value_type
из контейнера, используя следующий код.
//CustomTraits.h
template<typename C, typename = void>
struct has_push_back : std::false_type {};
template<typename C>
struct has_push_back<C, std::void_t< decltype(std::declval<C>())::value_type > > :
std::true_type {};
Это вызывается так
//MessaDecoder.h
template <typename Container,
typename = std::enable_if_t<has_push_back<Container>::value>
>
class MessageDecoder{/*Class Def...*/};
//Server.h
using buffer_t = std::deque<std::tuple<std::string, uint64_t>>;
std::shared_ptr<MessageHelper::MessageDecoder<buffer_t>> _decoder_ptr;
Я пробовал значительное количество вариантов в попытке заставить этот код компилироваться. Я проверил, что value_type
является действительным, извлекая его как параметр шаблона в MessageDecoder.h
с Container::value_type
, и он компилируется. Однако, делая то же самое и то, что я описал выше в CustomTraits.h
, не удается правильно запустить специализированный шаблон, и мне интересно, почему и как это исправить. Вот некоторые ошибки, которые я получаю.
Error C3203 'MessageDecoder': unspecialized class template can't be used as a template argument for template parameter '_Ty', expected a real type
Error C2938 'enable_if_t<false,void>' : Failed to specialize alias template
Я использую VS2017 C ++ 17 последнее обновление.