enable_if和自动返回类型?

问题描述 投票:1回答:1

我想通过shared_ptr使用type_traits来重载。

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返回类型将是最好的。第二种类型,但感觉有点笨重。

或者有更好的方法吗?谢谢。

c++ typetraits enable-if
1个回答
5
投票

如果你只想为不同的类型运行不同的代码行或两行代码,那么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;
}

这是有效的,因为丢弃了未执行的路径,因此在编译时只编译了真正的路径。

© www.soinside.com 2019 - 2024. All rights reserved.