我编写了一个类型特征模板来测试类型是否是
std::chrono::duration<Rep, Period>
。我被困了很长一段时间,不知道如何推导出 Rep
和 Period
。
我在 cppreference.com 上为标准类型特征给出的“可能的实现”上构建了这个解决方案。我基本上理解它是如何工作的,但我对第二个测试函数签名中的
...
感到困惑。
#include <chrono>
#include <type_traits>
namespace detail {
template <typename T, typename Rep = T::rep, typename Period = T::period>
std::bool_constant<std::is_same_v<T, std::chrono::duration<Rep, Period>>> test();
template <typename>
std::false_type test(...); // How does `...` help here?
}
template <typename T>
struct is_duration : decltype(detail::test<std::remove_cv<T>::type>()) {};
template <typename T>
constexpr bool is_duration_v = is_duration<T>::value;
static_assert(is_duration_v<std::chrono::high_resolution_clock::duration>);
static_assert(is_duration_v<volatile std::chrono::microseconds>);
static_assert(is_duration_v<const std::chrono::microseconds>);
static_assert(!is_duration_v<double>);
该省略号是否像 C 中那样表示可变参数列表?
是的。
省略号如何帮助区分该测试与其他测试?
它始终是可能的匹配重载中“最不专业”的,因此,如果有另一个匹配重载,则将选择该重载。