【发布时间】:2021-08-27 05:03:43
【问题描述】:
我编写了一个模板包装器,它应该找出类是否拥有该函数。
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";
}
但一切都在那里,即即使没有 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());
我也没有在函数中插入(与上面相同的错误)
【问题讨论】:
-
但是我得到了一些错误:这是预期的行为。你期待什么行为?
-
@songyuanyao 我在那里用了一个向量,希望它会通过
-
没有没有函数参数的
std::vector::push_back()重载。 -
除了答案中的问题外,
foo上没有 SFINAE,您要么需要根据has_member的值对其进行专门化,要么实际对其应用 SFINAE。目前它只获得一个bool参数,即true或false -
@463035818_is_not_a_number 好的,谢谢
标签: c++ templates sfinae decltype