gpt4 book ai didi

c++ - enable_if 和自动返回类型?

转载 作者:行者123 更新时间:2023-11-30 01:02:37 25 4
gpt4 key购买 nike

我想使用 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++ - enable_if 和自动返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55695443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com