如何正确地将 decltype 与 SFINAE 一起应用?
How to properly apply decltype together with SFINAE?
我写了一个模板包装器,应该查明 class 是否拥有该函数。
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{};
但我不知道如何应用它correctly.I一开始是这样尝试的:
template<typename T, bool = has_member<T>::value>
void foo(T& container) {
std::cout << "i here";
}
但是一切都在那里,即即使没有 push_back 功能:
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());
我也没有在函数中插入(错误与上述相同)
I use a vector there and expected that it will pass
问题出在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>::value
是 true
时,实例化 foo<T, true>
被调用,否则 foo<T, false>
被调用,两者有效。
我写了一个模板包装器,应该查明 class 是否拥有该函数。
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{};
但我不知道如何应用它correctly.I一开始是这样尝试的:
template<typename T, bool = has_member<T>::value>
void foo(T& container) {
std::cout << "i here";
}
但是一切都在那里,即即使没有 push_back 功能:
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());
我也没有在函数中插入(错误与上述相同)
I use a vector there and expected that it will pass
问题出在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>::value
是 true
时,实例化 foo<T, true>
被调用,否则 foo<T, false>
被调用,两者有效。