enable_if и тип автоматического возврата? - PullRequest
1 голос
/ 15 апреля 2019

Я хочу использовать 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 тип возвращаемого значения будет наилучшим. Второй тип делает это, но чувствует себя немного неуклюжим.

Или есть лучший способ сделать это? Благодаря.

1 Ответ

5 голосов
/ 15 апреля 2019

Если вы просто хотите запустить другую строку кода или две для разных типов, то constexpr, если , позволяет вам делать это без необходимости использовать enable_if и позволяет использовать автоматическое вычитание типа возврата. Вы можете упростить getX до

template <typename T>
auto getX(T t)
{
    if constexpr (boost::has_dereference<T>::value)
        return t->x;
    else
        return t.x;
}

и это работает, потому что путь, который не выполнен, отбрасывается, поэтому во время компиляции компилируется только истинный путь.

...