У меня есть метод со следующей сигнатурой
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