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