如何正确应用decltype和SFINAE



我编写了一个模板包装器,它应该可以查明类是否拥有该函数。

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, bool = has_member<T>::value>
void foo(T& container) {
std::cout << "i here";
}

但一切都在那里,即即使没有推回功能:

std::set<int> st;
foo(st); // okey

尝试更改为:

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());

我也没有在函数中插入(与上面的错误相同(

我在那里使用了一个向量,并期望它能通过

问题出在std::declval<T>().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{};

实时

关于为什么第一个解决方案不起作用,因为当has_member<T>::valuetrue时,实例化foo<T, true>被调用,否则foo<T, false>被调用,两者都是有效的。

相关内容

  • 没有找到相关文章

最新更新