C++03: Как получить тип возвращаемого значения функции?
У меня есть структура, которая выглядит примерно так:
struct Foo {
typedef size_t result_type;
template <class TYPE>
result_type operator()(const TYPE& type) const;
};
Я тестирую эту структуру, и я хочу быть в состоянии утверждать, что тип возвращаемого значения operator()
равно size_t
, Если бы я мог использовать C++11, я бы пошел в decltype
Однако у меня есть доступ только к C++03. Есть несколько причин, по которым я хочу проверить что-то настолько очевидное:
- У моей команды очень строгие правила тестирования, где даже вещи, которые можно проверить визуально, должны быть проверены
- Регрессионное тестирование. Я хочу убедиться, что это не изменится в будущем.
- Это более упрощенная версия кода, все немного сложнее и заслуживает большего тестирования в полной версии.
Какие варианты я должен сделать это в C++03? Мне все равно, будет ли это проверка времени компиляции или выполнения, просто то, что позволяет мне сделать утверждение в моем тестовом драйвере.
2 ответа
C++03 не может напрямую запрашивать тип возвращаемого значения. Вы можете вывести его с помощью шаблона функции (как предлагает Коди Грей в комментариях), но для целей тестирования вам не нужно этого делать. Просто вызовите тестируемую функцию и передайте результат в набор перегрузки, например:
template <typename AnythingElse>
void Foo(AnythingElse const&) { assert(false); }
void Foo(YourType const&) { /* pass */ }
Тем не менее, я бы сказал, что тестирование возвращаемого типа, вероятно, является ошибкой - тестирование детали реализации вместо результатов тестирования.
Если вам нужно обеспечить бинарную совместимость некоторых структур данных или сообщений, вы можете проверить свойства типа, а не сам тип. Они могут измениться для так называемого size_t в двух разных архитектурах.
assert(EXPECTED_SIZE == sizeof(result_type));
assert(EXPECTED_MIN == std::numeric_limits<result_type>::min());
assert(EXPECTED_MAX == std::numeric_limits<result_type>::max());