C++ 如何与SFINAE一起正确应用decltype?
我编写了一个模板包装器,该包装器应该能够发现类是否拥有该函数C++ 如何与SFINAE一起正确应用decltype?,c++,templates,sfinae,decltype,C++,Templates,Sfinae,Decltype,我编写了一个模板包装器,该包装器应该能够发现类是否拥有该函数 template<typename...> using void_t = void; template <typename ,typename = void> struct has_member:std::false_type{}; template<typename T> struct has_member<T, void_t<decltype(std::declval<T&
template<typename...>
using void_t = void;
template <typename ,typename = void>
struct has_member:std::false_type{};
template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back())>>:std::true_type{};
我很乐意得到一些帮助来找出我做错了什么
还有。
所有结构是否都可以替换为
template<typename T>
using has_type = decltype(std::declval<T>().push_back());
模板
使用has_type=decltype(std::declval().push_back());
我也没有在函数中得到insert(与上面的错误相同)
我在那里使用了一个向量,希望它能通过
问题在于std::declval()。push_-back()
,没有push_-back
对std::vector
一无所获
您需要将参数传递给push_back
,例如
template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back(std::declval<typename T::value_type>()))>>:std::true_type{};
模板
结构有_成员:std::true_类型{};
关于为什么第一个解决方案不起作用,因为当
has_member::value
为true
时,实例化foo
被调用,否则foo
被调用,两者都是有效的。但是我得到了一些错误:这是预期的行为。你期望的是什么行为?@songyuanyao我在那里使用了一个向量,并期望它能通过。没有没有没有函数参数的std::vector::push_back()
重载。除了答案中的问题之外,foo
上没有SFINAE,您需要根据has_member
的值对其进行专门化,或者对其实际应用SFINAE。目前它只得到一个bool
参数,该参数要么是true
要么是false
@463035818\u不是一个数字好的,谢谢。事实上,我甚至不认为您需要考虑这些参数。谢谢你的帮助!
template<typename T,typename std::enable_if_t< has_member<T>::value ,int>* = nullptr >
void foo(T& container) {
std::cout << "i here";
}
std::vector<int> vc(10);
foo(vc);
Error (active) E0304 no instance of function template "foo" matches the argument list
Error C2672 'foo': no matching overloaded function found
Error C2783 'void foo(T &)': could not deduce template argument for '__formal'
template<typename T>
using has_type = decltype(std::declval<T>().push_back());
template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back(std::declval<typename T::value_type>()))>>:std::true_type{};