Виртуальная переопределение и перегрузка функции-члена C ++ одновременно

Что-то достаточно простое, чтобы вписываться в список, без библиотек или других внешних зависимостей. Для Python> = 3.6 очень просто писать с помощью f-строк.

Идея состоит в том, чтобы преобразование строк округловало в другое место, чем вам нужно и затем отбросить последнюю цифру.

>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nout+1}f}'[:-1] for x in [2/3, 4/5, 8/9, 9/8, 5/4, 3/2]]
['0.666', '0.800', '0.888', '1.125', '1.250', '1.500']

Конечно, здесь есть округление (именно для четвертой цифры), но округление в некоторой точке невозможно. В случае, если переход между усечением и округлением имеет значение, вот немного лучший пример:

>>> nacc = 6  # desired accuracy (maximum 15!)
>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nacc}f}'[:-(nacc-nout)] for x in [2.9999, 2.99999, 2.999999, 2.9999999]]
>>> ['2.999', '2.999', '2.999', '3.000']

Бонус: удаление нулей справа

>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nout+1}f}'[:-1].rstrip('0') for x in [2/3, 4/5, 8/9, 9/8, 5/4, 3/2]]
['0.666', '0.8', '0.888', '1.125', '1.25', '1.5']
29
задан bombardier 25 February 2009 в 13:47
поделиться

2 ответа

Короткий ответ, "потому что это - то, как разрешение перегрузки работает в C++".

компилятор ищет функции F в классе C, и если он находит кого-либо, он останавливает поиск и пытается выбрать кандидата среди тех. Это только смотрит в базовых классах, если никакие функции соответствия не были найдены в производном классе.

Однако можно явно ввести функции базового класса в пространство имен производного класса:

struct C : public B {
  void f(void*) {}
  using B::f; // Add B's f function to C's namespace, allowing it to participate in overload resolution
};
43
ответ дан jalf 25 February 2009 в 13:47
поделиться
  • 1
    Знайте, что этот прием ведет себя очень плохо с кэшем (тот же rownum может ссылки различный " entities" когда запрос несколько раз выполняется с различными параметрами).. поэтому удостоверьтесь Ваш @Entity, POJO никогда не входит в кэш... – p3consulting 16 May 2018 в 17:02

Ну я думаю, во-первых, вы не поняли, что такое виртуальный механизм или полиморфизм. Когда полиморфизм достигается только с помощью указателей на объекты. Я думаю, вы новичок в C ++. Без использования указателей на объекты нет смысла в полиморфизме или виртуальном ключевом слове: использовать указатель базового класса и назначать ему желаемые объекты производного класса. Тогда позвоните и попробуйте.

-6
ответ дан 28 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: