我正在尝试使用以下代码从容器中提取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最新更新。
答案 0 :(得分:2)
更改
decltype(std::declval<C>())::value_type
要
typename C::value_type
declval
为您提供右值参考,您无法将成员从引用类型中拉出来(因为您只需要类型,所以不需要跳舞:C
)。你错过了typename
。