Хочется покрыть тестами static_assert. Но без жести с ручным раскомментированием строк тестирования, анализом выхлопа компилятора и т.п.
Вот пример темплейта со статическими ассертами:
template<typename Func>
void addMethod(const std::string& name, Func func) {
using traits = jrcpd::function_traits<decltype(func)>;
using Ret = typename traits::return_type;
using ArgsTuple = typename traits::argument_types;
static_assert(!std::is_same<Ret, void>::value, "void functions not supported");
static_assert(jrcpd::is_supported_type<Ret>::value, "Return type is not allowed");
static_assert(jrcpd::check_all_types_supported<ArgsTuple>(), "Argument type is not allowed");
functions[name] = [func](const JsonArray& args) -> std::string {
try {
if (args.size() != std::tuple_size<ArgsTuple>::value) {
throw std::runtime_error("Number of arguments mismatch");
}
// Check if each argument in JsonArray can hold the appropriate type from ArgsTuple
if (!jrcpd::TypeChecker<ArgsTuple>::check(args)) {
throw std::runtime_error("Argument type mismatch");
}
auto tpl_args = jrcpd::from_json<ArgsTuple>(args);
Ret result = jrcpd::apply(func, tpl_args);
return jrcpd::generate_response(true, result);
} catch (const std::exception& e) {
return jrcpd::generate_response(false, e.what());
}
};
}
Посоветуйте, как сейчас принято такое тестировать.