上次我找到了很多关于SFINAE的答案,建议使用void_t帮助器.
但我似乎并不明白它在以下方面有什么特别之处:
decltype (..., void()).
Run Code Online (Sandbox Code Playgroud)
考虑这个例子:
template <typename...>
using void_t = void;
template <typename T, typename = void>
struct has_foo : std::false_type {};
template <typename T>
struct has_foo <T, decltype (T().foo(), void())> : std::true_type {};
template <typename T, typename = void>
struct has_bar : std::false_type {};
template <typename T>
struct has_bar <T, void_t <decltype (T().bar())> > : std::true_type {};
class MyClass1
{
public:
int foo() { return 3; }
};
class MyClass2
{
public:
double bar() { return …Run Code Online (Sandbox Code Playgroud) 我想使用type_traits通过shared_ptr进行过载。
struct A {
A(int i) : x(i) {}
int x;
};
int main()
{
A a{4};
auto b = std::make_shared<A>(7);
A& c = a;
A* d = b.get();
A* e = &a;
std::cout << getX(a) << std::endl;
std::cout << getX(b) << std::endl;
std::cout << getX(c) << std::endl;
std::cout << getX(d) << std::endl;
std::cout << getX(e) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一种解决方案,但是存在必须预先定义返回类型的问题。
template <typename T>
typename std::enable_if_t<!boost::has_dereference<T>::value, int> getX(T t)
{
return t.x;
}
template <typename T>
typename std::enable_if_t<boost::has_dereference<T>::value, int> …Run Code Online (Sandbox Code Playgroud)