Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何与SFINAE一起正确应用decltype?_C++_Templates_Sfinae_Decltype - Fatal编程技术网

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{};