enable_if 和自动 return 类型?
enable_if and auto return type?
我想用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;
}
这是一个解决方案,但存在 return 类型必须预先定义的问题。
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> getX(T t)
{
return t->x;
}
但使用下面的方法,我可以将 return 类型设为 auto
,但它看起来有点笨拙。
template <typename T, typename std::enable_if_t<!boost::has_dereference<T>::value>* = nullptr>
auto getX(T t)
{
return t.x;
}
template <typename T, typename std::enable_if_t<boost::has_dereference<T>::value>* = nullptr>
auto getX(T t)
{
return t->x;
}
有没有一种方法可以使用第一种类型并仍然得到 return 类型 auto
?
我不想指定 A::x
的类型,所以 auto
return 类型最好。第二种是这样,但感觉有点笨拙。
或者有更好的方法吗?谢谢。
如果您只想 运行 不同类型的一两行不同的代码,那么 constexpr if 让您无需使用 enable_if
即可做到这一点,并允许您使用自动return类型推导。您可以将 getX
简化为
template <typename T>
auto getX(T t)
{
if constexpr (boost::has_dereference<T>::value)
return t->x;
else
return t.x;
}
这是可行的,因为未执行的路径被丢弃,因此在编译时仅编译真实路径。
我想用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;
}
这是一个解决方案,但存在 return 类型必须预先定义的问题。
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> getX(T t)
{
return t->x;
}
但使用下面的方法,我可以将 return 类型设为 auto
,但它看起来有点笨拙。
template <typename T, typename std::enable_if_t<!boost::has_dereference<T>::value>* = nullptr>
auto getX(T t)
{
return t.x;
}
template <typename T, typename std::enable_if_t<boost::has_dereference<T>::value>* = nullptr>
auto getX(T t)
{
return t->x;
}
有没有一种方法可以使用第一种类型并仍然得到 return 类型 auto
?
我不想指定 A::x
的类型,所以 auto
return 类型最好。第二种是这样,但感觉有点笨拙。
或者有更好的方法吗?谢谢。
如果您只想 运行 不同类型的一两行不同的代码,那么 constexpr if 让您无需使用 enable_if
即可做到这一点,并允许您使用自动return类型推导。您可以将 getX
简化为
template <typename T>
auto getX(T t)
{
if constexpr (boost::has_dereference<T>::value)
return t->x;
else
return t.x;
}
这是可行的,因为未执行的路径被丢弃,因此在编译时仅编译真实路径。