c++ - enable_if 和自动返回类型?
问题描述
我想使用 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;
}
这是一种解决方案,但存在必须预定义返回类型的问题。
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;
}
但是使用下面的方法,我可以制作返回类型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;
}
有没有一种方法可以使用第一种类型并且仍然获得返回类型auto
?
我不想指定类型,A::x
所以auto
返回类型是最好的。第二种类型可以做到这一点,但感觉有点笨拙。
或者有没有更好的方法来做到这一点?谢谢。
解决方案
如果您只想为不同的类型运行一两行不同的代码,那么constexpr if让您无需使用即可执行此操作,enable_if
并允许您使用自动返回类型推导。你可以简化getX
成
template <typename T>
auto getX(T t)
{
if constexpr (boost::has_dereference<T>::value)
return t->x;
else
return t.x;
}
这是有效的,因为未执行的路径被丢弃,因此在编译时只编译了真实路径。
推荐阅读
- c - 将数组传递给函数与将变量传递给函数
- c# - 奇怪的句柄必须是对话框中的有效异常
- angular - 使用 Jest 和 Testbed 测试 Angular 9 服务
- flutter - 访问子小部件状态属性
- c# - 如何在我的聊天机器人中添加 AD 身份验证 - MS 机器人框架 v4
- maven - Maven Mojo 在通过阶段调用时不使用反应器。当被称为独立目标时它工作正常
- nginx - 使用 Python 拉取 HTML 时出现 403 禁止错误,但可以在 Web 浏览器中查看
- angular - 错误:ENOENT:没有这样的文件或目录,打开 'google/protobuf/api.proto'
- html - 水平和垂直对齐旋转的文本
- python - 通过 Firebase 从 python 后端到 Android 应用程序的通知不会发送到电话