Как проверить время каста?

В задании меня попросили создать свои собственные static_cast и dynamic_cast, используя специализацию шаблонов. Как проверить, что мои статические приведения действительно выполняются во время компиляции, а динамические — во время выполнения?

template<typename Dst, typename Src>
static Dst my_static_cast(Src src);

template<typename Dst, typename Src>
static Dst my_dynamic_cast(Src src);

person Amit Ohayon    schedule 25.06.2015    source источник
comment
Проверить сгенерированный машинный код?   -  person Kerrek SB    schedule 25.06.2015
comment
Немного кода поможет, я думаю.   -  person Daniel Jour    schedule 25.06.2015
comment
Для динамических приведений вы можете доказать это, написав код, который компилируется нормально, но с ошибками во время выполнения. (например, для типов указателей dynamic_cast возвращает NULL, если они несовместимы)   -  person Adam Finley    schedule 25.06.2015
comment
@DanielJour добавил сигнатуры функций, чего бы это ни стоило ... сама реализация неприятна, и мне не нужен конкретный ответ на мой код, но в целом, как проверить время литья.   -  person Amit Ohayon    schedule 25.06.2015


Ответы (1)


Не полный ответ, но учтите это:

class D
{
public:
    virtual ~D(){}
};
class A : public D{};

class B{};

Теперь dynamic_cast<B*>(new A()) компилируется нормально (и возвращает 0), но static_cast<B*>(new A()) приводит к ошибке компиляции. Я почти уверен, что вы можете SFINAE сделать соответствующий тест.

Конечно, в этом тесте предполагается, что вам нужно различать только 100%-ное соответствие стандарту static_cast и 100-процентное соответствие стандарту dynamic_cast. Для обнаружения ошибок в вашей реализации необходимы дополнительные тесты.

РЕДАКТИРОВАТЬ: Вы не можете полностью протестировать его автоматически. Для приведения типов требуются аргументы времени выполнения, поэтому их нельзя проверить во время компиляции. И во время выполнения единственная разница между вычисляемой во время компиляции вещью и вычисляемой во время выполнения вещью является производительность. Я бы не рекомендовал тестировать по принципу «ну, приведения во время выполнения не могут быть такими быстрыми». Это просто не надежно.

person matb    schedule 25.06.2015