Метод шаблона, принимающий как постоянные, так и неконстантные аргументы - PullRequest
1 голос
/ 20 января 2020

У меня есть метод со следующей сигнатурой

template <typename T>
bool are_equal(T& lhs, T& rhs) { ... }

Он может принимать только неконстантные аргументы, поскольку он использует некоторые алгоритмы STL в унаследованном классе, который предоставляет только неконстантный итератор. В то же время остальная часть API несовместима в том смысле, что она обеспечивает shared_ptr's до T или const T, поэтому я должен сделать много are_equal(const_cast<T&>(*lhs_ptr), *rhs_ptr) для аргумента lhs, rhs или обоих.

Есть ли способ иметь один метод (в отличие от 4 перегруженных), который будет принимать любую комбинацию аргументов T& и const T& (или shared_ptr<T> / shared_ptr<const T> и всегда преобразовывать их на T& перед тем, как позвонить are_equal? Я пытался поиграться с std::conditional и std::remove_const, но на самом деле ничего не получилось.

Пример: http://coliru.stacked-crooked.com/a/243a98895aa4f6ce

1 Ответ

1 голос
/ 21 января 2020

Все, что вам нужно сделать, это const -квалифицировать все (допустив любой тип аргумента) и затем использовать const_cast:

template <typename T>
bool are_equal(const T& lhs, const T& rhs) {
  return detail::are_equal
    (const_cast<T&>(lhs),
     const_cast<T&>(rhs));
}
...